zoukankan      html  css  js  c++  java
  • 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);

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

    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);//用回调函数处理,此时对话框的消息处理函数不再处理。
    }
    本来我想将演示程序上传上来,可不知如何上传,所以初学者自己根据上面的操作步骤实验。

  • 相关阅读:
    MySQL管理工具-SQLyog 9.63的使用详解
    通讯录管理系统
    Mavenx学习找对方法,快速上手!
    晚风花间寺中人
    PE重装系统,U盘重装系统,一步到位,重装无忧!
    进入博客园的第一篇随笔,贡献给我最喜欢的作家-大冰
    天地有情尽白发,人间无意了沧桑
    狼和羊的故事(安徒生新篇)
    .Net Core CLR GC的浅度分析
    .net core 的夸代扫描标记card_table的细节分析
  • 原文地址:https://www.cnblogs.com/renyuan/p/2677291.html
Copyright © 2011-2022 走看看