【编码随笔】Win32下定时器使用解释与示例

本文详细介绍了Win32环境下如何使用定时器,包括MFC下的消息处理方式和直接调用API的方式。通过示例代码展示了SetTimer和KillTimer函数的使用,并解释了相关参数含义。在MFC中,定时器回调通过OnTimer函数实现;如果不使用MFC,可以使用全局API函数并指定回调函数。
摘要由CSDN通过智能技术生成


【参考资料:http://blog.csdn.net/weiwenhp/article/details/8733216】

【使用MFC的情况下】

示例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来区分
CCriticalSection g_criSection; //【阿甘补充:在这里使用了一个关键区对象】

BEGIN_MESSAGE_MAP(CTimerTestDlg, CDialog)
ON_WM_TIMER()
END_MESSAGE_MAP()

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) // 【阿甘补充:注意Timer序号的一一对应。否则无响应】
   {
       CString strInfo;
       strInfo.Format("I am number %d", nShowNum);

       GetDlgItem(IDC_STATIC)->SetWindowText(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函数就永远不会被调用到了.
}

【不使用MFC,直接调用API】
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
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值