duilib 实战 之 悬浮时间小窗口 2 显示当前时间

发布时间:2024年01月12日

实现如下图所示的 时间工具条功能

目录

一、时钟工具条

1、初始化窗口

1)、窗口置顶

2)、取消任务栏显示

3)、设置定时器

2、显示当前时间

3、变更大小适配

1)、动态改变BOX宽度等信息

2)、Label 更换字体后,重新刷新下

4、大小选项

5、实例代码


一、时钟工具条

1、初始化窗口

1)、窗口置顶



	//不能有swp_nozorder, 否则 置顶不起作用
	SetWindowPos(GetHWND(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_NOMOVE|SWP_NOREPOSITION);

2)、取消任务栏显示

获得GWL_STYLE

取消掉WS_EX_APPWINDOW

	//不在任务栏显示
	LONG styleValue = ::GetWindowLong(m_hWnd, GWL_EXSTYLE);
	styleValue &= ~(WS_EX_APPWINDOW);//当窗口可见时将一个顶层窗口放置在任务栏上,将此取消掉,不在任务栏显示
	styleValue |= WS_EX_TOOLWINDOW; //工具条窗口样式
	styleValue |= WS_EX_TOPMOST;    //最顶层,实测 topmost没起作用 需要setwindowPos下
	SetWindowLong(m_hWnd, GWL_EXSTYLE, styleValue);

3)、设置定时器

	SetTimer(GetHWND(), CLOCK_TIME, 1000,nullptr);

2、显示当前时间

#include <chrono>


    if (uMsg==WM_TIMER)
	{
       if (wParam == CLOCK_TIME)
		{

			auto currentTime = std::chrono::system_clock::now();
			std::time_t currentTime_t = std::chrono::system_clock::to_time_t(currentTime);


			// 将时间戳转换为tm结构体
			std::tm currentTime_tm;
			localtime_s(&currentTime_tm, &currentTime_t);

			
			char timeBuffer[26];
		
			std::string formatS;

			if (bShowSec_)
			{
				formatS = "%H:%M:%S";
			}
			else{
				formatS = "%H:%M";
			}

			if (strftime(timeBuffer, sizeof(timeBuffer), formatS.c_str(), &currentTime_tm) >0) {
				// 获取最终的时间字符串
				std::string timeString = timeBuffer;

				pTimeLab1_->SetUTF8Text(timeString);
				pTimeLab2_->SetUTF8Text(timeString);

			}
			else {
				// 处理  错误
			
			}
		}
   }

3、变更大小适配

1)、动态改变BOX宽度等信息

	pLogoBox_->SetFixedWidth(108);
	pLogoBox_->SetFixedHeight(44);
	pLogoBox_->SetAttribute(L"fadewidth", L"true");

这里需要注意 ,如果有fadewidth属性,动态改变宽度后,需要从新设置下,从新确定宽度

void TimeForm::SetMin()
{
	pLogoBox_->SetFixedWidth(108);
	pLogoBox_->SetFixedHeight(44);
	pLogoBox_->SetAttribute(L"fadewidth", L"true");

	pLogoBox_->SetBkColor(L"");
	pLogoBox_->SetBkImage(L"xnwRes/shrinkbk.png");

	pRestorBtnBox_->SetMargin(ui::UiRect(70, 0, 0, 0));

	pMainHBox->SetFixedHeight(44);
	pTimeBox1_->SetFixedWidth(80);


	pTimeLab1_->SetFont(L"system_12");
	pTimeLab2_->SetFont(L"system_12");

	pTimeLab1_->Refresh();//新增刷新Label函数
	pTimeLab2_->Refresh();

}

void TimeForm::SetMiddle()
{

	pLogoBox_->SetBkImage(L"");
	pLogoBox_->SetBkColor(L"xnw_black2");

	pLogoBox_->SetFixedWidth(108*2);
	pLogoBox_->SetFixedHeight(44*2);

	pLogoBox_->SetAttribute(L"fadewidth", L"true");
	pTimeBox1_->SetFixedWidth(80 * 2);
	pTimeBox1_->Arrange();
	pTimeBox1_->ArrangeSelf();

	pRestorBtnBox_->SetMargin(ui::UiRect(150, 0, 0, 0));



	pMainHBox->SetFixedHeight(44*2);

	ui::Label* pTimeLab1_ = (ui::Label*)FindControl(L"time1");
	pTimeLab1_->SetFont(L"system_22");

	ui::Label* pTimeLab2_ = (ui::Label*)FindControl(L"time2");
	pTimeLab2_->SetFont(L"system_22");

	pTimeLab1_->Refresh();//新增刷新Label函数
	pTimeLab2_->Refresh();
}

2)、Label 更换字体后,重新刷新下

不刷新的话,还是使用的原来的字体大小

这里在duilib Lable类中,自己扩展个 Refresh刷新功能

注意:需要自己在duilib扩展,也很简单,加个函数就行

template<typename InheritType>
void LabelTemplate<InheritType>::Refresh()
{
	if (this->GetFixedWidth() == DUI_LENGTH_AUTO || this->GetFixedHeight() == DUI_LENGTH_AUTO) {
		this->ArrangeAncestor();
	}
	else {
		this->Invalidate();
	}

	CheckShowToolTip();
}

4、大小选项

在 样式中 ,增加大小选项

5、实例代码

打赏20,可获得此实例代码

文章来源:https://blog.csdn.net/shuilan0066/article/details/135496278
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。