VC定时器的用法实例详解

 更新时间:2014年10月23日 14:11:59   投稿:shichen2014  
这篇文章主要介绍了VC定时器的用法,以实例形式详细讲述了VC定时器的原理与具体用法,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了VC中定时器的用法,分享给大家供大家参考。具体用法分析如下:

定时器在VC中的使用频繁,其原型为:

复制代码 代码如下:
WINUSERAPI UINT WINAPI SetTimer ( HWND hWnd , UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);

其中的参数用法如下:

hWnd       是欲设置定时器的窗体句柄。定时时间到时,系统会向该窗体发送WM_TIMER消息。
nIDEvent     定时器标识符。在一个窗体内可以使用多个定时器,不同的定时器根据nIDEvent来区分。
uElapse    定时时间,单位是毫秒。
lpTimerFunc   定时器的回调函数。如果该值为NULL,定时时间到时,定时器发送的消息WM_TIMER由窗体映像该消息的函数处理;否则由回调函数处理,说白一点,回调函数就是取代OnTimer的处理函数。

通常,我们在使用定时器时,只用到三个参数,即

复制代码 代码如下:
UINT CWnd::SetTimer(
UINT nIDEvent,
UINT nElapse,
void (CALLBACK EXPORT* lpfnTimer)(
HWND, UINT, UINT, DWORD) );

其实,这个函数只是MFC对API的封装,其实现函数为:
复制代码 代码如下:
_AFXWIN_INLINE UINT CWnd::SetTimer(UINT nIDEvent, UINT nElapse,
       void (CALLBACK* lpfnTimer)(HWND, UINT, UINT, DWORD))
       {
   ASSERT(::IsWindow(m_hWnd));
return ::SetTimer(m_hWnd, nIDEvent, nElapse,        (TIMERPROC)lpfnTimer);
}

由此可见,CWnd::SetTimer只是将API函数SetTimer的第一个参数设置成它自己的句柄而已。
有了上面的认识,对定时器的使用就清楚了,下面举例说明定时器的具体使用。
1.打开VC,新建一基于对话框的工程,工程名为Test。在对话框上添加一按钮,将其ID改为IDC_BUTTON_START,Caption改为 Start. 映像该按钮的BN_CLICKED消息,void CTestDlg::OnButtonStart();
2.再在对话框上添加一按钮,ID为ID_BUTTON_STOP,Caption改为Stop,映像消息为void CTestDlg::OnButtonStop();
3.添加一个Lable,ID改为IDC_STATIC_TIME,用于记数,表明定时器函数的执行。
4.映像对话框的WM_TIMER消息,void CTestDlg::OnTimer(UINT nIDEvent);
BEGIN_MESSAGE_MAP(CAssistantDlg, CDialog)
    ON_WM_TIMER()
END_MESSAGE_MAP()

以上的定现函数如下所示:

复制代码 代码如下:
void CTestDlg::OnButtonStart()
{
       SetTimer(1,1000,NULL);//启动定时器1,定时时间是1秒
}

void CTestDlg::OnButtonStop()
{
       KillTimer(1);        //关闭定时器1。
}

void CTestDlg::OnTimer(UINT nIDEvent)
{
       static int nTimer=0;
       CString strTmp="";
       strTmp.Format("Timer: %d",nTimer++);
       CWnd *pWnd=GetDlgItem(IDC_STATIC_TIME);
       pWnd->SetWindowText(strTmp);   将Lable中设置新值,表明定时器已经工作。
       CDialog::OnTimer(nIDEvent);
}

回调函数的使用。

如果不想使用窗体的WM_TIMER消息函数处理,可以使用回调函数来取代,读者可以在上面例子的基础上,增加一个回调函数,以证实前面的讨论。

首先,定义一个回调函数,回调函数的定义必须按照如下格式。

复制代码 代码如下:
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );

我的实现函数如下:

复制代码 代码如下:
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime )
{
AfxMessageBox("Timer is running!");//定时器时间到,强出一对话框,表明定时器已经运行。
}

将上面的启动函数稍做修改
复制代码 代码如下:
void CTestDlg::OnButtonStart()
{
// SetTimer(1,1000,NULL);//启动定时器1,定时时间是1秒
   SetTimer(1,1000,(TIMERPROC)TimerProc);//用回调函数处理,此时对话框的消息处理函数不再处理。
}

希望本文所述对大家的VC程序设计有所帮助。

相关文章

  • C语言中`||`的短路机制详解

    C语言中`||`的短路机制详解

    在C语言中,逻辑或运算符(||)是一种常用的逻辑运算符,用于组合多个条件表达式,C语言中的逻辑或运算符具有短路机制,这是一种非常重要的概念,本文将深入解释C语言中的||短路机制以及其在编程中的应用,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • Qt实现简单UDP通信

    Qt实现简单UDP通信

    这篇文章主要为大家详细介绍了Qt实现简单UDP通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • VC++中内存对齐实例教程

    VC++中内存对齐实例教程

    这篇文章主要介绍了VC++中内存对齐的实现方法,具有很高的实用价值,需要的朋友可以参考下
    2014-08-08
  • C++11中lambda、std::function和std:bind详解

    C++11中lambda、std::function和std:bind详解

    大家都知道C++11中增加了许多的新特性,下面在这篇文中我们就来聊一下lambda表达式,闭包,std::function以及std::bind。文中介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。
    2017-01-01
  • C语言 volatile与const同时使用应注意的问题

    C语言 volatile与const同时使用应注意的问题

    “volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这个值”。因此,它们本来就不是矛盾的
    2013-09-09
  • VC动态生成菜单项的实现方法

    VC动态生成菜单项的实现方法

    这篇文章主要介绍了VC动态生成菜单项的实现方法,在桌面应用程序开发中常会用到的一个功能,需要的朋友可以参考下
    2014-08-08
  • C++STL之string类的使用

    C++STL之string类的使用

    这篇文章主要为大家详细介绍了C++STL中的string类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言宏定义使用分析

    C语言宏定义使用分析

    在宏定义中,“宏名称”和“宏字符串”是通过“空格”来区分的,某些朋友不要混淆了,接下来请祥看本文
    2012-12-12
  • C++ 结构体初始化与赋值详解

    C++ 结构体初始化与赋值详解

    本文主要介绍了C++ 结构体初始化与赋值详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言野指针及如何规避详解

    C语言野指针及如何规避详解

    这篇文章主要为大家介绍了C语言野指针及如何规避详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论