如果我们的代码中没有消息循环过程,我们可以参考这篇文件进行处理 window c++ 定时器使用方法。而Duilib基本库已经有了消息处理机制,我们就不在采用这种方式。
对话框demo框架
在基于Duilib库开发对话框时,我们一般建议基于WinImplBase
类作为该对话框的基类,因为在WinImplBase类
中封装了需用许多操作,便于对话框的创建;下面我们就基于WinImplBase类
实现定时器功能。
/*某个对话框的基类demo,这里只截取了部分函数声明*/
class CXXXDialog: public WindowImplBase
{
public:
CXXXDialog();
~CXXXDialog();
//对话框初始函数,WindowImplBase类中的虚函数声明
virtual void InitWindow();
//消息处理函数,WindowImplBase类中的虚函数声明
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
//根据消息处理函数定义定时器消息处理函数
virtual LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam);
};
定时器实现
1. 启动定时器
我们在InitWindow函数中开始定时器的创建工作,其示例代码如下:
void CXXXDialog::InitWindow()
{
#define SHOW_DIALOG_MSG_TIMER_ID 3010
#define SHOW_DIALOG_MSG_TIMER_INTERVAL 1000
::SetTimer(m_PaintManager.GetPaintWindow(),
SHOW_DIALOG_MSG_TIMER_ID,
SHOW_DIALOG_MSG_TIMER_INTERVAL,
NULL);
}
2. 定时器调度
我们利用Duilib已经实现的消息循环,进行定时器消息识别和调度
LRESULT CXXXDialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_TIMER:
{
return OnTimer(uMsg, wParam, lParam);
}
}
return __super::HandleMessage(uMsg, wParam, lParam);
}
3. 销毁定时器
当对话框销毁时,我们在析构函数中实现定时器的销毁,确保资源正常销毁。其示例代码如下:
CDoubleCheckDialog::~CDoubleCheckDialog()
{
::KillTimer(m_PaintManager.GetPaintWindow(),SHOW_DIALOG_MSG_TIMER_ID);
}