CListCtrl类覆盖和OnTimer

时间:2014-06-27 08:32:44

标签: c++ windows winapi mfc clistctrl

我不确定我是否做了无证件的事情。我创建了自己的派生自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,我应该避免使用自己?

1 个答案:

答案 0 :(得分:2)

CListCtrl documentation我们看到此文:

  

另见:

     

从那篇文章中,有一些相关的摘录:

  

如果调用SetTimer函数发送定期WM_TIMER消息   到列表控件,你可能会发现WM_TIMER消息处理程序(   列表控件的OnTimer函数只被调用两次。

     

...

     

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

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

我的建议是将列表控件的计时器视为超出范围,并保留供控件使用。对于派生类,请使用其他计时器。创建仅消息窗口并使用它来接收计时器事件。你可以subclass CWnd to achieve this