zoukankan      html  css  js  c++  java
  • MFC中OnTimer的应用

     

    MFC中OnTimer的应用

    OnTimer()函数用于实现定时控制功能,定时控制功能主要由下面三个函数共同实现:

    SetTimer, KillTimer()和OnTimer().

    粗略的说,Settimer是设置一个计时器并开始执行计时器Ontimer中的代码,Ontimer是计时器所执行的代码。KillTimer用于停止计时器。

    或者说Settimer是设置定时器的,Ontimer是响应Settimer消息的。当Settimer设置的时间到了,就会自动调动Ontimer()函数。

    先了解下SetTimer这个API函数的原型

    UINT_PTR SetTimer(
      HWND hWnd,              // 窗口句柄
      UINT_PTR nIDEvent,      // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
      UINT uElapse,           // 时间间隔,单位为毫秒
      TIMERPROC lpTimerFunc   // 回调函数
    );
    例如
    SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
    在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了
    于是SetTimer函数的原型变为:
    UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))
    当使用SetTimer函数的时候,就会生成一个计时器。
    SetTimer函数中
    nIDEvent指的是计时器的标识,也就是名字。
    nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。
    第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认的是OnTime函数。
    这个函数怎么生成的呢?
    你需要在需要计时器的类的生成onTime函数:
    在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成OnTime函数了。
    然后在函数里添加代码,让代码实现功能。
    每隔一段时间(SetTimer设置的时间)就会自动执行一次。
    例:
    SetTimer(1,1000,NULL);
    1:计时器的名称;
    1000:时间间隔,单位是毫秒;
    NULL:使用onTime函数。
    当不需要计时器的时候调用KillTimer(nIDEvent);
    例如:KillTimer(1);  //此处的ID号“1 ”应与SetTimer()中的ID号一致
    如果需要要加入两个或者两个以上的 timer怎么办? 
      继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4......
      SetTimer(2,1000,NULL); //ID为2,定时1000ms
      SetTimer(3,500,NULL);   //ID为3,定时500ms
      WINDOWS会协调他们的。当然OnTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码: 
      OnTimer(nIDEvent) 
      { 
          switch(nIDEvent) 
          { 
               case 1:........; 
                   break; 
               case 2:.......; 
                   break; 
               case 3:......; 
                   break; 
           } 
      } 

    在控制台中使用定时器不能简单的SetTimer了事,这在控制台里这种SetTimer的方式是有点麻烦的,需要自己写消息循环投递WM_TIMER消息。其实在控制台里可以使用多媒体时钟来计时: 

    example: 

    //启动计时器 
    MMRESULT nIDTimerEvent = timeSetEvent( 
      1000,//延时1秒 
       0, 
      TimeProc, 
      0, 
      (UINT)TIME_PERIODIC); 
    if( nIDTimerEvent == 0 ) 
      cout<<"启动计时器失败"<<endl; 


    //回调过程(时钟到来,回调函数被系统自动调用) 
    void CALLBACK TimeProc( 
      UINT uID,       
      UINT uMsg,     
      DWORD dwUser,   
      DWORD dw1,     
      DWORD dw2       


      cout<<"时钟到来"<<endl; 
       

     
    当然了,你要是习惯于SetTimer,那就用SetTimer吧:
    下面是我在Console下用SetTimer写的一个例子:
    #include <windows.h>
    #include <iostream>
    using namespace std;
    void CALLBACK TimeProc( 
        HWND hwnd,       
        UINT message,     
        UINT idTimer,     
        DWORD dwTime);
    int main()
    {
     SetTimer(NULL,1,1000,TimeProc);
     MSG   msg;   
     while(GetMessage(&msg,NULL,0,0))   
     {   
      if(msg.message==WM_TIMER)   
      {   
       DispatchMessage(&msg);   
      }   
     }   
     return 0;
    }
    void CALLBACK TimeProc( 
        HWND hwnd,       
        UINT message,     
        UINT idTimer,     
        DWORD dwTime)   
    {
       cout<<"a timer comming"<<endl;
    }
  • 相关阅读:
    第15届创新英语大赛初赛第二阶段题目
    13.递归第一次
    13.递归第一次
    13.递归第一次
    13.递归第一次
    Algs4-1.3.19给出一段代码,删除链表的尾结点
    Algs4-1.3.18下面链表在代码的作用
    Algs4-1.3.17从文件中读取信息生成Transaction对象数组
    Algs4-1.3.16从文件中读取日期生成日期对象数组
    Algs4-1.3.15打印Queue中倒数第k个元素的值
  • 原文地址:https://www.cnblogs.com/jack-jia-moonew/p/4276459.html
Copyright © 2011-2022 走看看