Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209765
  • 博文数量: 39
  • 博客积分: 420
  • 博客等级: 下士
  • 技术积分: 457
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-01 10:22
文章分类

全部博文(39)

文章存档

2015年(15)

2014年(11)

2013年(1)

2012年(2)

2011年(1)

2010年(9)

我的朋友

分类: C/C++

2012-02-02 16:33:03

在MFC中有两种定时器:
一、自定义回调函数的定时器,如设置定时器函数原型:
UINT_PTR SetTimer(
  HWND hWnd, // 窗口句柄
  UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
  UINT uElapse, // 时间间隔,单位为毫秒
  TIMERPROC lpTimerFunc // 回调函数
  );
当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。
回调函数函数格式为:
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
例子:
创建一个对话框工程,然后在对话框中添加两个按钮,分别为开始定时和结束定时(以下是自己添加的代码)
  1. void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
  2. {
  3.     TRACE("开始定时\n");
  4. }
  5. void CSetTimeDlg::OnButton1() //按钮开始定时
  6. {
  7.     // TODO: Add your control notification handler code here
  8.     SetTimer(1,1000,TimerProc);
  9. }
  10. void CSetTimeDlg::OnButton2() //结束定时器
  11. {
  12.     // TODO: Add your control notification handler code here
  13.     MessageBox("定时器结束");
  14.     KillTimer(1);
  15. }
由于TimerProc定义的是全局函数,使用MessageBox时会出错,我就使用TRACE代替,那么这就需要调试时才能看到效果。
 
 
 
二、不使用回调函数,如设置定时器函数原型:
UINT_PTR SetTimer(
  UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
  UINT uElapse, // 时间间隔,单位为毫秒
  TIMERPROC lpTimerFunc // 回调函数
  );
第三个参数可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。
如:
SetTimer(1,1000,NULL);
 1:计时器的名称;
 1000:时间间隔,单位是毫秒;
 NULL:使用onTime函数。
当不需要计时器的时候调用KillTimer(nIDEvent);
例如:KillTimer(1);
例子:
创建一个对话框工程,然后在对话框中添加两个按钮,分别为开始定时和结束定时(以下是自己添加的代码)
  1. void CSetTimeDlg::OnButton1() //按钮开始定时
  2. {
  3.     // TODO: Add your control notification handler code here
  4.     SetTimer(1,2000,NULL);
  5. }

  6. void CSetTimeDlg::OnTimer(UINT nIDEvent) //定时器
  7. {
  8.     // TODO: Add your message handler code here and/or call default
  9.     MessageBox("开始定时器");
  10.     CDialog::OnTimer(nIDEvent);
  11. }

  12. void CSetTimeDlg::OnButton2() //结束定时器
  13. {
  14.     // TODO: Add your control notification handler code here
  15.     MessageBox("定时器结束");
  16.     KillTimer(1);
  17. }
阅读(1818) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~