MFC中定时器消息函数未被调用问题

项目场景:

最近在写一个激光扫描仪的测试程序,基于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,但并未进行深入和细致的了解,导致一些基础的知识点掌握不牢靠,惭愧惭愧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值