基于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);
}
发布了281 篇原创文章 · 获赞 327 · 访问量 66万+

猜你喜欢

转载自blog.csdn.net/xiao3404/article/details/104096069
今日推荐