admin管理员组

文章数量:1567271

2024年5月18日发(作者:)

VC++中通过SetTimer函数创建并使用定时器

SetTimer函数可以用来创建或设置一个定时器,该函数创建的定时器

nElapse,vo(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))

当用法SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent

指的是计时器的标识,也就是名字。nElapse指的是时光间隔,也就

与Timer控件(定时器控件)效果相同。 当你想每隔一段时光执行一

是每隔多长时光触发一次大事。第三个参数是一个回调函数,在这个

件事的的时候,你可以用法它。 用法定时器的办法比较容易,通常告

函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就

知WINDOWS一个时光间隔,然后WINDOWS以此时光间隔周期性触发程序。

是用法系统默认的回调函数,系统默认认的是onTime函数。这个函数

通常有两种办法来实现:发送WM_TIMER消息和调用应用程序定义的回

怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在

调函数。 SetTimer函数的使用 1.1 用WM_TIMER来设置定时器 先请

ClassWizard里,挑选需要计时器的类,添加WM_TIME消息映射,就

看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd,

自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。

// 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可

每隔一段时光就会自动执行一次。 例: SetTimer(1,1000,NULL);

以通过该ID推断是哪个定时器 UINT uElapse, // 时光间隔,单位为

1:计时器的名称; 1000:时光间隔,单位是毫秒; NULL:用法onTime

毫秒 TIMERPROC lpTimerFu // 回调函数 ); 例如

函数。 当不需要计时器的时候调用KillTimer(nIDEvent); 例如:

SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器 在

KillTimer(1); 1.2 调用回调函数 此办法首先写一个如下格式的

MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了

回调函数 void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT

于是SetTimer函数的原型变为: UINT SetTimer(UINT nIDEvent,UINT

第 1 页 共 3 页

nTimerid,DWORD dwTime); 然后再用SetTimer(1,100,TimerProc)函

数来建一个定时器,第三个参数就是回调函数地址。 二. 或许你会问,

假如我要加入两个或者两个以上的 r怎么办? 继续用SetTimer函数

吧,上次的timer的ID是1,这次可以是2,3,4。。。。

SetTimer(2,1000,NULL); SetTimer(3,500,NULL); 嗯,WINDOWS会

协调他们的。固然onTimer函数体也要发生变幻,要在函数体内添加每

一个timer的处理代码: onTimer(nIDEvent) { switch(nIDEvent)

{ case 1:........; break; case 2:.......; break; case

3:......; break; } } Timer大事,即定时器大事,是在嬉戏编

程中,常常用法的一个大事。借助它可以产生定时执行动作的效果。这

篇文章,就和大家一起探讨一下如何用法SetTimer()函数。 1、

SetTimer定义在那里? SetTimer表示的是定义个定时器。按照定义

指定的窗口,在指定的窗口(CWnd)中实现OnTimer大事,这样,就可

以相应大事了。 SetTimer有两个函数。一个是全局的函

数::SetTimer() UINT SetTimer( HWND hWnd, // handle of window

for timer messages UINT nIDEvent, // timer identifier UINT

uElapse, // time-out value TIMERPROC lpTimerFunc // aress of

timer procere ); 其中hWnd 是指向CWnd的指针,即处理Timer

大事的窗口类。说道窗口类(CWnd),我们有须要来看一下CWnd的继

承状况:CWnd有以下子类:CFrameWnd,CDialog,CView,CConolBar等

类。这也意味这些类中都可以定义SetTimer大事。 同时,SetTimer

()在CWnd中也有定义,即SetTimer()是CWnd的一个成员函数。

CWnd的子类可以调用该函数,来设置触发器。 UINT SetTimer( UINT

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

UINT, UINT, DWORD) ); 参数含义: nIDEvent:是指设置这个定时

器的iD,即身份标记,这样在OnTimer()大事中,才干按照不同的

定时器,来做不同的大事响应。这个ID是一个无符号的整型。

nElapse 是指时光延迟。单位是毫秒。这意味着,每隔nElapse毫秒

第 2 页 共 3 页

系统调用一次Ontimer()。 void (CALLBACK EXPORT* lpfnTimer)(HWND,

UINT, UINT, DWORD) Specifies the address of the appliion-ppli

TimerProc callback function that processes the WM_TIMER messages.

If this parameter is NULL, the WM_TIMER messages are placed in

the application s message queue and handled by the CWnd object。

意思是,指定应用程序提供的TimerProc回调函数的地址,来处里这个

Timer大事。假如是NULL,处理这个Timer大事的定义这个Timer的

CWnd对象。他将WM_TIMER消息传递给这个对象,通过实现这个对象的

OnTimer()大事来处理这个Timer大事。 所以,普通状况下,我们

将这个值设为NULL,有设置该定时器的对象中的OnTimer()函数来处

理这个大事。 同样的,我们再看看KillTimer()和OnTimer()的

定义: KillTimer同SetTimer()一样,他也有两个,一个是全局

的::KillTimer(),另一个是CWnd的一个函数。他的声明如下: //全

局函数 BOOL KillTimer( HWND hWnd, // handle of window that

installed timer UINT uIDEvent // timer identifier ); //CWnd

函数 BOOL KillTimer( int nIDEvent ); 这两个函数表示的意思是

将iD为nIDEVENT的定时器移走。使其不再作用。其使用犹如SetTimer

()一样。 再看看OnTimer() CWnd::OnTimer afx_msg void

OnTimer( UINT nIDEvent ); ontimer()是响应CWnd对象产生的

WM_Timer消息。nIDEvent表示要响应TIMER大事的ID。 二、Timer

大事的用法: 由以上的分析,我们应当很清晰,如何来用法Timer

大事。假定我们在视图上画一个渐变的动画。我们首先在菜单栏上添

加一个菜单项,给这个菜单添加响应: pView-

SetTimer(1,1000,NULL);//pView是视图类的指针,这里是在视图类

当中设置一个定时器。 添加完毕,再给视图类添加一个WM_Timer大

事的相应。在OnTimer()函数中编写函数,举行相应。

第 3 页 共 3 页

本文标签: 函数大事时光回调计时器