CListCtrl类重写和OnTimer
CListCtrl class override and OnTimer
我不确定我是否在做一些未记录的事情。我创建了自己的类,派生自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是保留的,我应该避免使用自己?
从CListCtrl
文档中我们看到这段文字:
也看到:
- 知识库文章Q200054: PRB: OnTimer()不重复调用列表控件
从那篇文章中,摘录了一些相关的内容:
如果你调用SetTimer函数发送周期性的WM_TIMER消息对于列表控件,您可能会发现WM_TIMER消息处理程序OnTimer函数)只被调用两次。
…
列表控件使用计时器编辑标签和滚动。当你处理定时器消息时,如果定时器ID是你自己的定时器,不要调用默认处理程序(CListCtrl::OnTimer)。
所以,这证实了你观察到的。列表控件使用定时器。我找不到所使用的特定id的文档。我猜微软不希望承诺记录所使用的特定id。他们会将控件的实现视为私有的,并希望在未来的版本中保留使用更多计时器id的选项。但是正如IInspectable指出的那样,他们可以通过保留一个id范围来做到这一点。
我的建议是将列表控件的计时器视为越界,并保留给该控件使用。对于派生类,使用不同的计时器。创建一个消息窗口,并使用它来接收定时器事件。您可以子类化CWnd
来实现这一点。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 在 C++ 中用派生类型重写成员函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 为重写std::exception的库生成swig接口时出错
- 如何强制从重写方法调用重写的方法基方法?
- 用于C++的静态二进制检测或二进制重写工具和框架
- 如何将 if else 语句重写为 switch 语句
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 用 C 重写C++类
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 重写虚拟函数和继承
- C++调用使用重写函数的父类函数
- 重写打印函数而不是覆盖基类
- 不允许在类定义之外重写
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- C++:从抽象类重写纯虚拟运算符重载
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- CListCtrl类重写和OnTimer