如果我們的代碼中沒有消息循環過程,我們可以參考這篇文件進行處理 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);
}