SetTimer和OnTimer的使⽤
最近在公司做⼀个MFC项⽬,因为是MFC新⼿,所以在这⾥记录⼀些最近⽤到和学到的东西留着以后查阅。
今天遇到的⼀个问题是要在窗⼝刚刚初始化完成时⾃动检测⼀个配置⽂件是否存在(实际上就是检测是不是⾸次登陆,⾸次登陆时创建这个配置⽂件),如果不存在就弹出MessageBox提醒⽤户完成配置。检测配置⽂件是否存在⾮常容易实现,直接使⽤CFileFind类的FindFile函数确定⽂件是否存在。困难的是如何在窗⼝初始化完成时⾃动弹出提⽰框。我⾸先想到的是将弹出提⽰框的功能加在主窗⼝的OnInitDialog函数中,但结果是提⽰框确实⾃动弹出了,但主窗⼝并没有显⽰,只有在提⽰框关闭后才显⽰主窗⼝,这并不是我想要的结果。在⽹上问了问后发现可以使⽤SetTimer和OnTimer实现我想要的效果。
SetTimer函数简单说就是⼀个定时器函数,可以创建⼀个定时器并指定间隔时长TLen和回调函数,回调函数默认就是OnTimer函数。实现的效果是每隔TLen时间就产⽣⼀个消息调⽤⼀次OnTimer函数。在⽹上有很多关于SetTimer的使⽤⽅法的介绍,我照着他们介绍的⽅法完成代码后发现并没有按照预期调⽤OnTimer函数,之后⼜找了很多资料,有⼀个提到之所以没有实现调⽤OnTimer的功能是因为没有加上时间ON_WM_TIMER()消息。加上之后就正确了。下⾯是我代码
1 BEGIN_MESSAGE_MAP(Server_Info, CDialog) 2 ON_WM_TIMER() 3 END_MESSAGE_MAP() 4
5 BOOL Server_Info::OnInitDialog() 6 {
7 CDialog::OnInitDialog(); 8
9 SetTimer(1,500,NULL);//500ms定时消息,调⽤OnTimer。完成⾸次登陆路径设置的通知任务10
11 return TRUE;12 }13
14 // Server_Info 消息处理程序15
16 void Server_Info::OnTimer(UINT_PTR nIDEvent)17 {
18 KillTimer(1);
19 if(TRUE != isFirstLogin)20 {
21 MessageBox(TEXT(\"⾸次登陆需要选择测试报告路径!\"), TEXT(\"通知\"), MB_ICONINFORMATION);22 }
23 CDialog::OnTimer(nIDEvent);24 }
另外就是关于KillTimer函数的使⽤。在⽤SetTimer创建⼀个定时器后,如果不再需要这个定时器,可以直接使⽤KillTimer函数将他关闭。KillTimer函数只有⼀个参数对应于要关闭定时器的ID,也就是在使⽤SetTimer函数创建定时器时的第⼀个参数。因为我的需求是只需要在登陆后提醒⼀次就可以,所以在调⽤OnTimer函数后直接将这个定时器关掉,实现提醒⼀次的功能。