Chinaunix首页 | 论坛 | 博客
  • 博客访问: 348899
  • 博文数量: 88
  • 博客积分: 1695
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-06 15:48
个人简介

喜欢美食, 旅行..

文章分类

全部博文(88)

文章存档

2014年(2)

2013年(12)

2012年(14)

2010年(8)

2009年(52)

我的朋友

分类: WINDOWS

2009-10-22 17:43:16

定时器在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);//用回调函数处理,此时对话框的消息处理函数不再处理。

}
本来我想将演示程序上传上来,可不知如何上传,所以初学者自己根据上面的操作步骤实验。
 
 
文章转自:
 
补充说明:    (该说明来源于MSDN)

CWnd::SetTimer

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

Return Value

The timer identifier of the new timer if the function is successful. An application passes this value to the member function to kill the timer. Nonzero if successful; otherwise 0.

Parameters

nIDEvent

Specifies a nonzero timer identifier.

nElapse

Specifies the time-out value, in milliseconds.

lpfnTimer

Specifies the address of the application-supplied 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.

阅读(1354) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~