3 回答
TA贡献1876条经验 获得超7个赞
CWnd::SetTimer
UINT SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer) (HWND, UINT, UINT, DWORD) );
返回值:
如果函数成功,则返回新定时器的标识符。应用程序可以将这个值传递给KillTimer成员函数以销毁定时器。如果成功,则返回非零值;否则返回0。
参数: nIDEvent 指定了不为零的定时器标识符。
nElapse 指定了定时值;以毫秒为单位。
lpfnTimer 指定了应用程序提供的TimerProc回调函数的地址,该函数被用于处理WM_TIMER消息。如果这个参数为NULL,则WM_TIMER消息被放入应用程序的消息队列并由CWnd对象来处理。
说明:
这个函数设置一个系统定时器。指定了一个定时值,每当发生超时,则系统就向设置定时器的应用程序的消息队列发送一个WM_TIMER消息,或者将消息传递给应用程序定义的TimerProc回调函数。
lpfnTimer回调函数不需要被命名为TimerProc,但是它必须按照如下方式定义:
void CALLBACK EXPORT TimerProc(
HWND hWnd, // 调用SetTimer的CWnd的句柄
UINT nMsg, // WM_TIMER
UINT nIDEvent // 定时器标识
DWORD dwTime // 系统时间
);
定时器是有限的全局资源;因此对于应用程序来说,检查SetTimer返回的值以确定定时器是否可用是很重要的。
请参阅:WM_TIMER, CWnd::KillTimer, ::SetTimer
//-----------------------------------------------//
CWnd::OnTimer
afx_msg void OnTimer( UINT nIDEvent );
参数: nIDEvent 指定定时器的标识符。
说明:
当在SetTimer成员函数中指定的每一个时间间隔都被用来安装一个定时器之后,框架调用这个成员函数。
当在应用程序的消息队列中没有其它的消息时,Windows函数DispatchMessage发送一个WM_TIMER消息。
注意 框架调用这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现,这个实现将使用最初随着消息传递过来的参数,而不是使用你提供给函数的参数。
TA贡献1797条经验 获得超6个赞
nIDEvent最好设成大于10的ID,避免与系统定义的事件冲突,另外SetTimmer(1,1000,NULL),不知道你为什么要设为0,还有个原因如果你前面的代码有的地方在运行过程中出现问题也会导致后面的SetTimmer失效,你可以先把其他代码屏蔽,让Timmer运行,明白了道理再做。
例:
SetTimmer(10,1000,NULL);
void CVCMIDlg::OnTimer (UINT_PTR nIDEvent)
{
switch(nIDEvent)
{
case 10:
AfxMessageBox("On Timer");
break;
}
}
这个简单的,百分百运行。
- 3 回答
- 0 关注
- 180 浏览
添加回答
举报