关闭

MFC定时器的使用

标签: 定时器
205人阅读 评论(0) 收藏 举报
分类:

参考:http://www.cnblogs.com/chengxuyuancc/archive/2012/06/08/2542269.html

MFC提供了3个定时器函数来完成有关定时器功能:

  1. UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)( HWNDUINTUINTDWORD) );  
  2. afx_msg void OnTimer( UINT nIDEvent );  
  3. BOOL KillTimer( int nIDEvent );  


参数说明:

UINT nIDEvent:定时器的ID,给定时器唯一的身份验证,如果在一个程序中有多个定时器可以用这个ID来确定是那个定时器发送的消息。
UINT nElapse: 定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):
这个回调函数中实现刷新时所做的操作,如在数据库中读取数据。但是我们大多数时候不在这里实现,而是在OnTimer中。


函数功能:

SetTimer用来定义一个定时器的属性,如改定时器的ID,刷新时间,处理函数。
OnTimer实际使用系统定义消息来响应WM_TIMER消息,在这里可以实现对多定时器中的各个定时器分别响应,这里才是定时程序大展宏图的地方。
KillTimer用来结束一个定时器。

下面我们用一个例子来说明定时器的使用:
   这个例子用来实现一个简单的功能,就是在一个单文档程序中,每间隔5秒弹出一个消息框提示“定时器1”,每隔7秒弹出一个消息框提示“定时器2”。
   建立单文档程序略,一路Next。

=========================================================================

(1)在resource.h中定义两个定时器的ID

  1. #define IDTIMER1  1  
  2. #define IDTIMER2  2  


(2)在CMainFrame的OnCreate函数中定义两个定时器的属性。
SetTimer(TIMEID1,5000,0);
SetTimer(TIMEID2,7000,0);

(3) CMainFrame中对WM_TIMER进行响应。

  1. oid CMainFrame::OnTimer(UINT nIDEvent)  
  2. {  
  3.     // TODO: Add your message handler code here and/or call default  
  4.     switch(nIDEvent) {  
  5.     case TIMEID1:  
  6.         {     
  7.             AfxMessageBox("定时器1!");  
  8.             break;  
  9.         }  
  10. case TIMEID2:  
  11.         {     
  12.             AfxMessageBox("定时器2!");  
  13.             break;  
  14.         }  
  15.     default:  
  16.         ;  
  17.     }  
  18.      
  19.     CFrameWnd::OnTimer(nIDEvent);  
  20. }  


 

(4)在CMainFrame的析构函数中添加

  1. KillTimer(IDTIMER1);  
  2. KillTimer(IDTIMER2);  


 

==============================

参考2

当执行到程序的某一行代码时,需要添加计时器,就用这条语句:

SetTimer(1, 1000, NULL);

参数如下:

UINT_PTR SetTimer(UINT_PTR nIDEvent, UINT nElapse,
  void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD));

设置好后计时器立马生效,1秒后计时器发生中断,在代码所在的类中进行捕捉:

1.在该类的消息中添加:

  1. BEGIN_MESSAGE_MAP(CTab1, CDialog)  // CTab1是自己定义的一个类  
  2.     ...  
  3.     ON_WM_TIMER()  
  4.     ...  
  5. END_MESSAGE_MAP()  


 

2.所在的类中添加成员函数:

  1. void OnTimer(UINT_PTR nIDEvent);  

 

3.添加函数的代码,即捕捉后的执行代码:

  1. void CTab1::OnTimer(UINT_PTR nIDEvent)  
  2. {  
  3.     switch (nIDEvent)  
  4.     {  
  5.     case 1:  // 计时器1  
  6.                .... // 处理的代码  
  7.                KillTimer(1);  // 删除此计时器,否则计时器中断完后会自动重新开始计时,到下一次中断时还会发生新的中断  
  8.                break;  
  9.   
  10.     case 2:  // 计时器2  
  11.                .... // 处理的代码  
  12.                break;  
  13.     default:  
  14.                MessageBox("default: KillTimer");  
  15.                KillTimer(nIDEvent);  
  16.                break;  
  17.     }  
  18. }  
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:220500次
    • 积分:3303
    • 等级:
    • 排名:第10605名
    • 原创:73篇
    • 转载:285篇
    • 译文:0篇
    • 评论:9条
    最新评论