实现如下图所示的 时间工具条功能
目录
//不能有swp_nozorder, 否则 置顶不起作用
SetWindowPos(GetHWND(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_NOMOVE|SWP_NOREPOSITION);
获得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);
SetTimer(GetHWND(), CLOCK_TIME, 1000,nullptr);
#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(¤tTime_tm, ¤tTime_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(), ¤tTime_tm) >0) {
// 获取最终的时间字符串
std::string timeString = timeBuffer;
pTimeLab1_->SetUTF8Text(timeString);
pTimeLab2_->SetUTF8Text(timeString);
}
else {
// 处理 错误
}
}
}
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();
}
不刷新的话,还是使用的原来的字体大小
这里在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();
}
在 样式中 ,增加大小选项
打赏20,可获得此实例代码