我不确定我是否做了无证件的事情。我创建了自己的派生自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
设置为45
和43
。
是否有一些保留的计时器ID,我应该避免使用自己?
答案 0 :(得分:2)
从CListCtrl
documentation我们看到此文:
另见:
- Knowledge Base article Q200054:PRB:OnTimer()不会重复调用列表控件
从那篇文章中,有一些相关的摘录:
如果调用SetTimer函数发送定期WM_TIMER消息 到列表控件,你可能会发现WM_TIMER消息处理程序( 列表控件的OnTimer函数只被调用两次。
...
列表控件使用计时器编辑标签和滚动。 处理定时器消息时,如果定时器ID是您自己的定时器, 不要调用默认处理程序(CListCtrl :: OnTimer)。
所以,这证实了你所观察到的。列表控件使用计时器。我找不到所使用的特定ID的文档。我想微软不希望承诺记录所使用的特定ID。他们会将控件的实现视为私有,并希望在将来的版本中保留使用更多计时器ID的选项。但正如IInspectable指出的那样,他们可以通过保留一系列ID来做到这一点。
我的建议是将列表控件的计时器视为超出范围,并保留供控件使用。对于派生类,请使用其他计时器。创建仅消息窗口并使用它来接收计时器事件。你可以subclass CWnd
to achieve this。