zoukankan      html  css  js  c++  java
  • MFC定时器使用

    MFC定时器实现方法

    方法一:CWnd类提供的成员函数SetTimer实现定时器功能,只能在CWnd类或其派生类中调用。

    方法二:Windows API函数SetTimer来实现。

    MFC定时器

    启动定时器

    启动定时器就需要使用CWnd类的成员函数SetTimer。CWnd::SetTimer的原型如下:

    UINT_PTR SetTimer(
                 UINT_PTR nIDEvent,//指定一个非零的定时器ID
                 UINT nElapse,//指定间隔时间,单位为毫秒
                 void (CALLBACK* lpfnTimer)(HWND,
                                                                     UINT,
                                                                     UINT_PTR,
                                                                      DWORD
                                                                      )

         //指定一个回调函数的地址,

        //如果该参数为NULL,则WM_TIMER消息被发送到应用程序的消息队列,并被CWnd对象处理。

        //参数lpfnTimer如果此函数成功则返回一个新的定时器的ID,我们可以使用此ID通过KillTimer成员函数来销毁该定时器,如果函数失败则返回0。
               );

    处理定时事件

    1 通过WM_TIMER消息的消息响应函数

    2 通过回调函数

    如果要启动多个定时器就多次调用SetTimer成员函数。另外,在不同的CWnd中可以有ID相同的定时器,并不冲突。

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

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

    之后就可以在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 default  
    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.     CDialogEx::OnTimer(nIDEvent);     
    19. }    

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

    1. void CALLBACK EXPORT TimerProc(  
    2. HWND hWnd, // handle of CWnd that called SetTimer
    3. UINT nMsg, // WM_TIMER
    4. UINT nIDEvent // timer identification
    5. DWORD dwTime // system time
    6. ); 

    参数hWnd为调用SetTimer成员函数的CWnd对象的句柄,即拥有此定时器的窗口的句柄;参数nMsg为WM_TIMER,而且总是为WM_TIMER;参数nIDEvent为定时器ID;参数dwTime为系统启动以来的毫秒数,即GetTickCount函数的返回值。

    这样CWnd::SetTimer函数最后一个参数就可以为TimerProc。回调函数的名称不一定为TimerProc,可以取其他名字,但返回值类型、参数的类型和个数不能改变。回调函数为全局函数,需要写在使用它的位置的前面,或者写在后面然后在使用之前声明。

    销毁定时器

    销毁定时器需使用CWnd类的KillTimer成员函数,CWnd::KillTimer函数的原型如下:

    BOOL KillTimer(UINT_PTR nIDEvent); 

    参数nIDEvent为要销毁的定时器的ID,是调用CWnd::SetTimer函数时设置的定时器ID。如果定时器被销毁则返回TRUE,而如果没有找到指定的定时器则返回FALSE。如果要销毁多个定时器,则多次调用KillTimer函数并分别传入要销毁的定时器的ID。

    Windows API定时器

    启动定时器

    使用API函数SetTimer启动定时器,SetTimer函数的原型如下:

    UINT_PTR SetTimer(        

        HWND       hWnd,   //与定时器关联的窗口的句柄

        UINT_PTR  nIDEvent,   //非零的定时器ID,如果hWnd等于NULL,且还不存在ID为nIDEvent的定时器,那么nIDEvent参数被忽略,然后生成一个新ID的定时器,而如果hWnd不为NULL,且hWnd指定的窗口已存在ID为nIDEvent的定时器,那么这个已存在的定时器被新定时器所取代。

        UINT           uElapse,   //CWnd::SetTimer函数

        TIMERPROC    lpTimerFunc   //CWnd::SetTimer函数

    ); 

    处理定时事件

    如果调用SetTimer函数时最后一个参数为NULL,我们需要自己为WM_TIMER消息添加处理函数,要注意的是,WM_TIMER消息的附加数据wParam为定时器ID,lParam为回调函数的指针,如果调用SetTimer时回调函数为NULL,那么lParam也为NULL。

    而如果调用SetTimer函数时最后一个参数不为NULL,我们就需要定义回调函数。回调函数的定义同MFC定时器。

    销毁定时器

    销毁定时器使用KillTimer API函数,原型如下:

    BOOL KillTimer(HWND hWnd,UINT_PTR uIDEvent);  

    参数hWnd为与定时器关联的窗口的句柄,与启动定时器时SetTimer函数的hWnd参数值相同;参数uIDEvent为要销毁的定时器的ID,如果传递给SetTimer的参数hWnd有效,则uIDEvent应与传递给SetTimer的参数nIDEvent相同,而如果SetTimer的参数hWnd为NULL,则uIDEvent应为SetTimer返回的定时器ID。该函数成功则返回TRUE,否则返回FALSE。

  • 相关阅读:
    C++笔记(2018/2/6)
    2017级面向对象程序设计寒假作业1
    谁是你的潜在朋友
    A1095 Cars on Campus (30)(30 分)
    A1083 List Grades (25)(25 分)
    A1075 PAT Judge (25)(25 分)
    A1012 The Best Rank (25)(25 分)
    1009 说反话 (20)(20 分)
    A1055 The World's Richest(25 分)
    A1025 PAT Ranking (25)(25 分)
  • 原文地址:https://www.cnblogs.com/lucas-hsueh/p/3734220.html
Copyright © 2011-2022 走看看