CListCtrl类重写和OnTimer

CListCtrl class override and OnTimer

本文关键字:OnTimer 重写 CListCtrl      更新时间:2023-10-16

我不确定我是否在做一些未记录的事情。我创建了自己的类,派生自CListCtrl,然后覆盖其中的OnTimer处理程序:

void CListCtrl2::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
    case MY_TIMER_ID:
        {
            //Do my processing
            doMyProcessing();
        }
        break;
    default:
        {
            //Default
            CListCtrl::OnTimer(nIDEvent);
        }
        break;
    }
}

但对我来说似乎很奇怪的是,这个OnTimer()例程是用不是我的定时器id调用的。例如,仅从快速调试检查点研究中发现,我的default处理程序被调用时,nIDEvent设置为4543

是否有一些定时器id是保留的,我应该避免使用自己?

CListCtrl文档中我们看到这段文字:

也看到:

  • 知识库文章Q200054: PRB: OnTimer()不重复调用列表控件

从那篇文章中,摘录了一些相关的内容:

如果你调用SetTimer函数发送周期性的WM_TIMER消息对于列表控件,您可能会发现WM_TIMER消息处理程序OnTimer函数)只被调用两次。

列表控件使用计时器编辑标签和滚动。当你处理定时器消息时,如果定时器ID是你自己的定时器,不要调用默认处理程序(CListCtrl::OnTimer)。

所以,这证实了你观察到的。列表控件使用定时器。我找不到所使用的特定id的文档。我猜微软不希望承诺记录所使用的特定id。他们会将控件的实现视为私有的,并希望在未来的版本中保留使用更多计时器id的选项。但是正如IInspectable指出的那样,他们可以通过保留一个id范围来做到这一点。

我的建议是将列表控件的计时器视为越界,并保留给该控件使用。对于派生类,使用不同的计时器。创建一个消息窗口,并使用它来接收定时器事件。您可以子类化CWnd来实现这一点。