[ windows程序设计(programing windows) ] - timer入门

A timer is an internal routine that repeatedly measures a specified interval, in milliseconds.(这是 microsoft 给出的解释 )


计时器周期性的给程序一个WM_TIMER消息,该消息的 wParam 参数是计时器的标识符, lParam 参数是被SetTimer函数设置的回调函数TimerProc的指针。


相关函数介绍: 

UINT_PTR WINAPI SetTimer(
  _In_opt_ HWND      hWnd,
  _In_     UINT_PTR  nIDEvent,
  _In_     UINT      uElapse,
  _In_opt_ TIMERPROC lpTimerFunc
);

SetTimer函数的第一个参数是要与该计时器关联的窗口句柄,该参数可以为nullptr;

第二个参数是计时器的标识符,类型是无符号整形,建议是定义在头文件中的宏,但值不应该设置为0 /* 例:#define TIMER 1 */;

第三个参数是计时器的计时间隔,单位是毫秒,范围从USER_TIMER_MINIMUN ( 0x0000000A ) 到 USER_TIMER_MAXIMUM ( 0x7FFFFFFF ), 如果超出范围则被设置为边界值;

第四个参数为计时器函数,该函数应被定义如下

VOID CALLBACK TimerProc(
  _In_ HWND     hwnd,
  _In_ UINT     uMsg,
  _In_ UINT_PTR idEvent,
  _In_ DWORD    dwTime
);

第一个参数与SetTimer函数相同;

第二个参数为消息,传递给该形参的值应固定为WM_TIMER;

第三个参数为计时器的标识符;

第四个参数应是从GetTickCount函数传回的值,这是从系统启动到现在的毫秒数。

BOOL WINAPI KillTimer(
  _In_opt_ HWND     hWnd,
  _In_     UINT_PTR uIDEvent
);

第一个参数是与指定计时器关联的窗口句柄;

第二个参数是指定计时器的标识符。


函数用法:

SetTimer的用法有三种,在此我会一一介绍;

方法一:

#define TIMER 1

……

SetTimer ( hWnd, TIMER, 100, nullptr);

……

KillTimer (hWnd, TIMER);


这种用法会建立一个计时器,该计时器每隔100ms也就是0.1s使hWnd所指向的窗口接收到一个WM_TIMER消息。

更改次计时器的时间间隔只需要重新调用一边 SetTimer 函数,将 uElapse 设置为你想要的时间,注意单位为ms,更改计时器时间将会重置计时器。

这种方法是最基本的方法。

方法二:

#define TIMER 1

……

SetTimer ( hWnd, TIMER, 100, TimerProc);

……

KillTimer ( hWnd, TIMER);


此方法建立一个时间间隔为0.1s的计时器,与第一种方法不同的是TimerProc将会对WM_TIMER的消息处理。

你可以在 hWnd 所指的回调函数中处理 WM_TIMER 消息,但是这将会使 TImerProc 没有意义,既然写了这个函数那就是要用的,我想应该不会有人这样做的。

更改计时器时间的方法同上。

方法三:

UINT idTImer = SetTImer (nullptr, 0, 100, TImerProc);

……

KillTimer (nullptr, idTimer);


如果 hWnd 参数被设置为nullptr, 并且nIdEvent参数没有匹配上已存在的计时器标识符,SetTimer函数会返回一个计时器ID。


补:同一个计时器可以与多个窗口句柄相关联;同一个窗口可以有多个计时器,利于计时器标识符( wParam )来区别计时器消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值