VS2010/MFC MFC 常用类:定时器 Timer

15 篇文章 1 订阅

**

定时器简介

**
定时器,可以帮助开发者或者用户定时完成某项任务。在使用定时器时,我们可以给系 统传入一个时间间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期 性的自动操作。例如,我们可以在数据采集系统中,为定时器设置定时采集时间间隔为 1 个 小时,那么每隔 1 个小时系统就会采集一次数据,这样就可以在无人操作的情况下准确的进 行操作。

**

MFC 定时器

**
VS2013 编程中,我们可以使用 MFC 的 CWnd 类提供的成员函数 SetTimer 实现定时 器功能,也可以使用 Windows API 函数 SetTimer 来实现。两者使用方法实际上很类似, 但也有不同。
CWnd 类的 SetTimer 成员函数只能在 CWnd 类或其派生类中调用,而 API 函数 SetTi mer 则没有这个限制,这是一个很重要的区别。因为本教程主要是讲解 MFC 编程,所以这 里就先重点讲解 MFC 定时器的用法.

1、启动定时器。
启动定时器就需要使用CWnd类的成员函数SetTimer。

CWnd::SetTimer的原型如下: 
            UINT_PTR SetTimer(              
            UINT nElapse,              
(           HWND,           
            UINT,          
            UINT_PTR, 
             DWORD        )
); 

参数 nIDEvent 指定一个非零的定时器 ID;参数 nElapse 指定间隔时间,单位为毫秒; 参数 lpfnTimer 指定一个回调函数的地址,如果该参数为 NULL,则 WM_TIMER 消息被发 送到应用程序的消息队列,并被 CWnd 对象处理。如果此函数成功则返回一个新的定时器 的 ID,我们可以使用此 ID 通过 KillTimer 成员函数来销毁该定时器,如果函数失败则返回 0。

通过 SetTimer 成员函数我们可以看出,处理定时事件可以有两种方式,一种是通过 W M_TIMER 消息的消息响应函数,一种是通过回调函数。
如果要启动多个定时器就多次调用 SetTimer 成员函数。另外,在不同的 CWnd 中可 以有 ID 相同的定时器,并不冲突

2、为 WM_TIMER 消息添加消息处理函数,或者定义回调函数。

如果调用 CWnd::SetTimer 函数时最后一个参数为 NULL,则通过 WM_TIMER 的消息 处理函数来处理定时事件。添加 WM_TIMER 消息的处理函数的方法是,在 VS2010 工程的 Class View 类视图中找到要添加定时器的类,点击右键,选择 Properties,显示其属性页, 然后在属性页工具栏上点击 Messages 按钮,下面列表就列出了所有消息,找到 WM_TIM ER 消息,添加消息处理函数。添加后,cpp 文件中会出现类似如下内容:

1. BEGIN_MESSAGE_MAP(CExample44Dlg, CDialogEx)    
2.     ......    
3.     ON_WM_TIMER()    
4. END_MESSAGE_MAP()    
5.    
6. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)    
7. {    
8.     // TODO: Add your message handler code here and/or call def ault    
9.    
10.     CDialogEx::OnTimer(nIDEvent);    
11. } 

之后就可以在 OnTimer 函数中进行相应的处理了。OnTimer 的参数 nIDEvent 为定时
器 ID,即在 SetTimer 成员函数中指定的定时器 ID,如果有多个定时器,我们可以像下面这 样处理:

1. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)       
2. {       
3.     // TODO: Add your message handler code here and/or call def ault       
4.     switch (nIDEvent)       
5.     {       
6.     case 1:       
7.         // 如果收到 ID 为 1 的定时器的消息则调用 func1 函数       
8.         func1();       
9.         break;       
10.     case 2:       
11.         // 如果收到 ID 为 2 的定时器的消息则调用 func2 函数       
12.         fun2();     
13.        break;      
14.     ......       
15.     default:       
16.         break;       
17.     }       
18.       
19.     CDialogEx::OnTimer(nIDEvent);       
20. } 

如果调用 CWnd::SetTimer 函数时最后一个参数不为 NULL,则需要定义回调函数。回 调函数的形式如下:

C++代码

1. void CALLBACK EXPORT TimerProc(    
2.    
3. HWND hWnd, // handle of CWnd that called SetTimer    
4.    
5. UINT nMsg, // WM_TIMER    
6.    
7. UINT nIDEvent // timer identification    
8.    
9. DWORD dwTime // system time    
10.    
11. );   
   参数 hWnd 为调用 SetTimer 成员函数的 CWnd 对象的句柄,即拥有此定时器的窗口 的句柄;参数 nMsg 为 WM_TIMER,而且总是为 WM_TIMER;参数 nIDEvent 为定时器 I D;参数 dwTime 为系统启动以来的毫秒数,即 GetTickCount 函数的返回值。 
   这样 CWnd::SetTimer 函数最后一个参数就可以为 TimerProc。 

销毁定时器。
不再使用定时器时,可以销毁它。销毁定时器需使用 CWnd 类的 KillTimer 成员函数, CWnd::KillTimer 函数的原型如下:
C++代码
1. BOOL KillTimer(UINT_PTR nIDEvent);

   参数 nIDEvent 为要销毁的定时器的 ID,是调CWnd::SetTimer 函数时设置的定时器 ID。如果定时器被销毁则返回 TRUE,而如果没有找到指定的定时器则返回 FALSE。 

   如果要销毁多个定时器,则多次调用 KillTimer 函数并分别传入要销毁的定时器的 ID。

详细参考请见http://download.csdn.net/download/iflyme/9917838

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值