项目场景:
最近在写一个激光扫描仪的测试程序,基于Windows MFC单文档模式开发,需要实现一秒钟刷新一下界面的功能。
问题描述
在视图类中增加了WM_TIMER消息处理函数和消息映射,在视图类的构造函数中添加了创建定时器的语句,编译正常,运行后界面并没有自动刷新,发现OnTimer函数未被调用。
原因分析:
SetTimer这个API函数的原型 :
UINT_PTR SetTimer(HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了
于是SetTimer函数的原型变为:
UINT SetTimer(
UINT nIDEvent,
UINT nElapse,
void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)
)
我在程序中使用的如下语句
SetTimer(1,100,NULL)
经过观察发现,问题出在窗口句柄上,因为创建定时器的语句写在构造视图类的构造函数里,执行的时候窗口还未创建,窗口句柄为空,所以才导致问题的发生。
解决方案:
在视图类中添加WM_CREATE消息处理函数,然后将创建定时器的语句写在这个里面,编译运行,问题解决。
事后反思:
虽然一直使用MFC,但并未进行深入和细致的了解,导致一些基础的知识点掌握不牢靠,惭愧惭愧。