MFC定时器SetTimer函数用法总结

MFC定时器SetTimer函数用法总结CWnd 类的 SetTimer 成员函数只能在 CWnd 类或其派生类中调用 而 API 函数 SetTimer 则没有这个限制 这是一个很重要的区别 1 启动定时器 nbsp nbsp nbsp nbsp nbsp nbsp 启动定时器就需要使用 CWnd 类的成员函数 SetTimer CWnd SetTimer 的原型如下 nbsp nbsp nbsp nbsp nbsp nbsp 参数 nIDEvent 指定一个非零的定时器 ID 参数 nElapse 指定间隔时间 单位为毫秒 参数 lp

      CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用,而API函数SetTimer则没有这个限制,这是一个很重要的区别。

1、启动定时器。

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

  MFC定时器SetTimer函数用法总结    

参数nIDEvent指定一个非零的定时器ID;

参数nElapse指定间隔时间,单位为毫秒;

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

       通过SetTimer成员函数我们可以看出,处理定时事件可以有两种方式,一种是通过WM_TIMER消息的消息响应函数,一种是通过回调函数。

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

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

      如果调用CWnd::SetTimer函数时最后一个参数为NULL,则通过WM_TIMER的消息处理函数来处理定时事件。添加WM_TIMER消息的处理函数的方法是,在VS2010工程的类向导,选择要添加定时器的类,在消息列表中找到WM_TIMER消息,添加消息处理函数。添加后,cpp文件中会出现类似如下内容:

C++代码

BEGIN_MESSAGE_MAP(CExample44Dlg,CDialogEx)   

    ……   

    ON_WM_TIMER()   

END_MESSAGE_MAP()   

  

voidCExample44Dlg::OnTimer(UINT_PTR nIDEvent)   

{   

    // TODO: Add your message handler code hereand/or call default   

  

    CDialogEx::OnTimer(nIDEvent);   

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

C++代码

voidCExample44Dlg::OnTimer(UINT_PTR nIDEvent)      

{// TODO: Add your message handler code here and/or call default      

    switch (nIDEvent)      

{      

case 1:      

        //在这添加执行定时器1的任务;      

        break;      

     case2:      

       //在这添加执行定时器2的任务; 

        break;     

    ……      

    default:      

        break;      

    }      

  CDialogEx::OnTimer(nIDEvent);      

}    

 

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

C++代码

MFC定时器SetTimer函数用法总结

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

       这样CWnd::SetTimer函数最后一个参数就可以为TimerProc。

       注意:回调函数的名称不一定为TimerProc,可以取其他名字,但返回值类型、参数的类型和个数不能改变。

       回调函数的例子:

C++代码

VOIDCALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)      

{      

   switch(nTimerid)      

   {      

   case 1:       

         // 处理ID为1的定时器的事件       

         break;      

   case 2:       

         // 处理ID为2的定时器的事件      

         break;    

   ……   

   default:   

        break;     

   }      

   

 

       回调函数为全局函数,需要写在使用它的位置的前面,或者写在后面然后在使用之前声明。

3、销毁定时器。

       不再使用定时器时,可以销毁它。销毁定时器需使用CWnd类的KillTimer成员函数,CWnd::KillTimer函数的原型如下:

C++代码

BOOLKillTimer(UINT_PTR nIDEvent); 

 

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

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

4.MFC定时器经典例子

实现功能:单击对话框中的“开始计数”按钮,编辑框中数字每个1s时间递增显示。

如下图:

MFC定时器SetTimer函数用法总结

制作步骤:

1.  在VS2010中新建一个项目,命名为“Timer”,选择MFC向导建立基于对话框;

2.  在自动生成的对话框模板中,删除所有静态文本控件和按钮控件。添加一个编辑框控件和一个按钮控件,使用默认的IDC_EDIT1和IDC_BUTTON1,编辑框的ReadOnly属性设置True。

3.  在CTimerDlg类的类向导中,为编辑框IDC_EDIT1添加int类型成员变量m_CountTime和CEdit类型的m_Edit1对象。

在CTimerDlg类TimerDlg.h头文件中找到

int  m_CountTime;将它修改为

static  int m_CountTime;//静态整形成员变量;

在CTimerDlg类TimerDlg.cpp源文件的构造函数中删除:

m_CountTime=0;

在CTimerDlg类TimerDlg.cpp源文件的头文件下方添加:

int  CTimerDlg::m_CountTime=0;//在全局为静态整形成员变量初始化;

int Num=0;//全局变量;

4.  在CTimerDlg类TimerDlg.cpp源文件中找到BOOLCTimerDlg::OnInitDialog()函数的// TODO: 在此添加额外的初始化代码,在其下面添加:

MFC定时器SetTimer函数用法总结

注意:要调整好编辑框大小尺寸,以适应设置的文本字体大小;

5. 在CTimerDlg类TimerDlg.cpp源文件中添加SetTimer函数中使用的回调函数:

MFC定时器SetTimer函数用法总结

6. 双击“开始计时”按钮,添加其消息处理函数:

MFC定时器SetTimer函数用法总结

MFC定时器SetTimer函数用法总结

7. 在VS2010工程的类向导,选择CTimerDlg类,在消息列表中找到WM_CLOSE消息,为对话框右上角“关闭”按钮添加消息处理函数:

MFC定时器SetTimer函数用法总结

8.总结:

① 在SetTimer函数的回调函数中,如果要使用类中的成员变量m_CountTime,则不仅需要把m_CountTime修改成静态成员变量,而且还要在全局对m_CountTime初始化赋值。但是这样虽然编译无错误,但是不能实现每隔1s时间m_CountTime值自加。

②在全局定义了int Num=0;变量,在“开始计时”按钮的消息处理函数中,将Num赋给m_CountTime,再将m_CountTime值显示在编辑框中。在SetTimer函数的回调函数中让Num自加的目的实现。

__________________________________________________________________________________________________________________________________________________________

附页:

通过Windows API函数使用定时器

       1、启动定时器。

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

C++代码

UINT_PTRSetTimer(         

    HWND    

            hWnd,   

    UINT_PTR    

            nIDEvent,   

    UINT    

            uElapse,   

    TIMERPROC    

            lpTimerFunc   

); 

 

       参数hWnd为与定时器关联的窗口的句柄;参数nIDEvent为非零的定时器ID,如果hWnd等于NULL,且还不存在ID为nIDEvent的定时器,那么nIDEvent参数被忽略,然后生成一个新ID的定时器,而如果hWnd不为NULL,且hWnd指定的窗口已存在ID为nIDEvent的定时器,那么这个已存在的定时器被新定时器所取代。参数uElapse和lpTimerFunc同CWnd::SetTimer函数。

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

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

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

       3、销毁定时器。

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

C++代码

BOOLKillTimer(HWND hWnd,UINT_PTR uIDEvent);   

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





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207253.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午2:13
下一篇 2026年3月19日 下午2:14


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号