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

来源:互联网 发布:rtmp嗅探器软件 编辑:程序博客网 时间:2024/05/01 12:29

**

定时器简介

**
定时器,可以帮助开发者或者用户定时完成某项任务。在使用定时器时,我们可以给系 统传入一个时间间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期 性的自动操作。例如,我们可以在数据采集系统中,为定时器设置定时采集时间间隔为 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

原创粉丝点击