MFC中OnTimer函数的使用方法
来源:互联网 发布:java 语法糖不够 编辑:程序博客网 时间:2024/06/06 01:20
OnTimer()函数用于实现定时控制功能,定时控制功能主要由下面三个函数共同实现:
SetTimer, KillTimer()和OnTimer().
粗略的说,Settimer是设置一个计时器并开始执行计时器Ontimer中的代码,Ontimer是计时器所执行的代码。KillTimer用于停止计时器。
或者说Settimer是设置定时器的,Ontimer是响应Settimer消息的。当Settimer设置的时间到了,就会自动调动Ontimer()函数。
先了解下SetTimer这个API函数的原型
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
例如
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了
于是SetTimer函数的原型变为:
UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))
当使用SetTimer函数的时候,就会生成一个计时器。
SetTimer函数中
nIDEvent指的是计时器的标识,也就是名字。
nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。
第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认的是OnTime函数。
这个函数怎么生成的呢?
你需要在需要计时器的类的生成onTime函数:
在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成OnTime函数了。
在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成OnTime函数了。
然后在函数里添加代码,让代码实现功能。
每隔一段时间(SetTimer设置的时间)就会自动执行一次。
每隔一段时间(SetTimer设置的时间)就会自动执行一次。
例:
SetTimer(1,1000,NULL);
1:计时器的名称;
1000:时间间隔,单位是毫秒;
NULL:使用onTime函数。
当不需要计时器的时候调用KillTimer(nIDEvent);
例如:KillTimer(1); //此处的ID号“1 ”应与SetTimer()中的ID号一致
如果需要要加入两个或者两个以上的 timer怎么办?
继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4......
继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4......
SetTimer(2,1000,NULL); //ID为2,定时1000ms
SetTimer(3,500,NULL); //ID为3,定时500ms
WINDOWS会协调他们的。当然OnTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:
OnTimer(nIDEvent)
{
switch(nIDEvent)
{
case 1:........;
break;
case 2:.......;
break;
case 3:......;
break;
}
}
在控制台中使用定时器不能简单的SetTimer了事,这在控制台里这种SetTimer的方式是有点麻烦的,需要自己写消息循环投递WM_TIMER消息。其实在控制台里可以使用多媒体时钟来计时:
example:
//启动计时器
MMRESULT nIDTimerEvent = timeSetEvent(
1000,//延时1秒
0,
TimeProc,
0,
(UINT)TIME_PERIODIC);
if( nIDTimerEvent == 0 )
cout<<"启动计时器失败"<<endl;
//回调过程(时钟到来,回调函数被系统自动调用)
void CALLBACK TimeProc(
UINT uID,
UINT uMsg,
DWORD dwUser,
DWORD dw1,
DWORD dw2
)
{
cout<<"时钟到来"<<endl;
}
当然了,你要是习惯于SetTimer,那就用SetTimer吧:
下面是我在Console下用SetTimer写的一个例子:
#include <windows.h>
#include <iostream>
using namespace std;
void CALLBACK TimeProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime);
int main()
{
SetTimer(NULL,1,1000,TimeProc);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_TIMER)
{
DispatchMessage(&msg);
}
}
return 0;
}
void CALLBACK TimeProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime)
{
cout<<"a timer comming"<<endl;
}
SetTimer(3,500,NULL); //ID为3,定时500ms
WINDOWS会协调他们的。当然OnTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:
OnTimer(nIDEvent)
{
switch(nIDEvent)
{
case 1:........;
break;
case 2:.......;
break;
case 3:......;
break;
}
}
在控制台中使用定时器不能简单的SetTimer了事,这在控制台里这种SetTimer的方式是有点麻烦的,需要自己写消息循环投递WM_TIMER消息。其实在控制台里可以使用多媒体时钟来计时:
example:
//启动计时器
MMRESULT nIDTimerEvent = timeSetEvent(
1000,//延时1秒
0,
TimeProc,
0,
(UINT)TIME_PERIODIC);
if( nIDTimerEvent == 0 )
cout<<"启动计时器失败"<<endl;
//回调过程(时钟到来,回调函数被系统自动调用)
void CALLBACK TimeProc(
UINT uID,
UINT uMsg,
DWORD dwUser,
DWORD dw1,
DWORD dw2
)
{
cout<<"时钟到来"<<endl;
}
当然了,你要是习惯于SetTimer,那就用SetTimer吧:
下面是我在Console下用SetTimer写的一个例子:
#include <windows.h>
#include <iostream>
using namespace std;
void CALLBACK TimeProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime);
int main()
{
SetTimer(NULL,1,1000,TimeProc);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_TIMER)
{
DispatchMessage(&msg);
}
}
return 0;
}
void CALLBACK TimeProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime)
{
cout<<"a timer comming"<<endl;
}
阅读全文
0 0
- MFC中OnTimer函数的使用方法
- (转)MFC中 OnTimer()函数的使用方法
- MFC中OnTimer函数
- MFC中定时器OnTimer函数的使用
- MFC中定时器OnTimer函数的使用
- MFC中OnTimer的应用
- MFC中OnTimer的应用
- MFC中OnTimer的应用
- MFC中OnTimer的应用
- MFC中OnTimer的应用
- MFC中OnTimer的应用
- MFC中OnTimer的应用
- MFC中OnTimer的应用
- MFC中OnTimer()的应用
- MFC中OnTimer的应用
- MFC中使用OnTimer()函数实现定时
- MFC延时函数OnTimer()
- C++ mfc学习之路三 Ontimer定时器的使用方法
- jquery-nestable控件使用
- 操作系统基础
- [百度面试题]100层楼,球可能会在某一层楼摔坏,问用2个球,最坏情况下几次测试可以找出该楼层
- android中的动画大全
- Spring Data Jpa 配合MongoDB实现持久层对象属性动态增加
- MFC中OnTimer函数的使用方法
- 组合数学学习笔记(一)
- 嵌入式计算中循环的优化——实例
- 抛开深层次底层,快速入门SpringMVC
- [tensorflow损失函数系列]weighted_cross_entropy_with_logits
- 我的技术之路开始
- DT_python精英团作业3-经验随笔
- 杭电 1248 寒冰王座 (完全背包)
- L0、L1与L2范数