关闭

OnTimer不被调用诊断步骤

1628人阅读 评论(0) 收藏 举报

在系统中设置了定时器,但发现OnTimer没有被调用。但windowproc函数是被调用的。

根据定时器的优先级确定应该是消息队列中的消息太多导致定时器消息没有被调用。

在windowproc打印日志监控什么消息被频繁调用,发现id=15的WM_PAINT消息被持续调用。

经查是在OnPaint处理中不小心注释掉了CPaintDC dc(this);这句,通常看起来这个对象好像没被使用,应该不受影响,实际上我错了,看看这个对象的构造函数都做了什么就清楚为什么一直发WM_PAINT消息。

构造函数会自动调用BeginPaint,析构调用EndPaint。BeginPaint函数的作用就是将窗口需要重绘的区域设置为空(也就是Update Region置空)
。在正常情况下,我们接收到了WM_PAINT消息后,窗口的Update Region都是非空的(如果为空就不需要发送WM_PAINT消息了)。而当你响应这个消息的时候又不调用BeginPaint来清空,窗口的Update Region就一直是非空的,系统就会一直发送WM_PAINT消息。这样就形成了一个处理WM_PAINT消息的死循环。





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:282357次
    • 积分:3851
    • 等级:
    • 排名:第8247名
    • 原创:100篇
    • 转载:58篇
    • 译文:0篇
    • 评论:30条
    最新评论