MFC timer使用简介

我们知道手机里面的闹钟可以设个时间,然后选择重复,这样每天会按时响.在Oracle中设定一个job也可以让它在每天预定的时间执行.

那同样假如你想让一些代码每过多长时间自动执行一次咋整呢?在MFC中可以使用timer,用法如下

示例1,使用消息处理

新建一个MFC project,类型选Dialog,

使用闹钟之前先得设定下时间嘛.这里同时也先设定下多久

//TimerTestDlg.h///

afx_msg void OnTimer(UINT_PTR nIDEvent); //回调函数,这里的函数名OnTimer不能换成其他名字.固定的

TimerTestDlg.cpp//

#include "afxmt.h"

#define TIMERID 8

//指定一个timer的ID,你可以同时设定多个timer,就用ID来区分

BEGIN_MESSAGE_MAP(CTimerTestDlg, CDialog)

ON_WM_TIMER()

END_MESSAGE_MAP()

 

CCriticalSection g_criSection;

BOOL CTimerTestDlg::OnInitDialog()

{

  SetTimer(TIMERID,1000,0);  //这里就相当于设定了timer,如果要停掉timer就是KillTimer(TIMERID)

}

void CTimerTestDlg::OnTimer(UINT_PTR nIDEvent)

{

  g_criSection.Lock();

  static int nShowNum = 1;

   if( nIDEvent == 8)

   {

       CString strInfo;

       strInfo.Format("I am number %d", nShowNum);

       GetDlgItem(IDC_STATIC)->SetWindowsText(strInfo);  //假如有一个text control ,用来显示数字

   }

 g_criSection.Unlock();

}

 

SetTimer 与 KillTimer两个类的定义

UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );

每一个参数表示timer id,用来区分不同的timer,假如同时定义了几个timer,在OnTimer()中做不同处理时,可以判断nIDEvent是哪一个.

nElapse表示多长时间执行一次,单位是毫秒,1000就是一秒.

lpfnTimer是回调函数,上面的示例是写成0,表示不显式指定回调函数,这样就是是调用OnTimer,如果你显式指定了回调函数,则OnTimer()函数就不会被调用了.

BOOL KillTimer( int nIDEvent);

直接通过timer id就停掉timer就行了.

 

示例2,直接指定回调函数

 

void CALLBACK Test(HWND hWnd,UINT para1,UINT_PTR para2,DWORD para3)

{

 

}

 

BOOL CTimerTestDlg::OnInitDialog()

{

SetTimer(TIMERID,1000,Test); //直接调用Test,这样之前写的OnTimer函数就永远不会被调用到了.

}

 

 

Win32 中的timer

上面讲的SetTimer和KillTimer是类CWnd中的方法,只要继承自它的窗口类都可以使用.

不过如果不是窗口类中也可以用timer,使用API的全局函数

UINT SetTimer(
HWND
hWnd, UINT nIDEvent, UINT uElapse,TIMERPROC lpTimerFunc);

其中后面三个参数跟上面的一样,只是多了个参数hWnd,指定一个窗口类的句柄.

同样KillTimer也只是多了这一个参数

 

BOOL KillTimer(
HWND
hWnd, // handle of window that installed timer
UINT uIDEvent // timer identifier
);

 

你可能感兴趣的:(4),C++)