基於Duilib庫創建定時器機制

如果我們的代碼中沒有消息循環過程,我們可以參考這篇文件進行處理 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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章