MFC中OnTimer函数的使用方法
生活随笔
收集整理的這篇文章主要介紹了
MFC中OnTimer函数的使用方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OnTimer()函數用于實現定時控制功能,定時控制功能主要由下面三個函數共同實現:
? HWND hWnd,????????????? // 窗口句柄
? UINT_PTR nIDEvent,????? // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器
? UINT uElapse,?????????? // 時間間隔,單位為毫秒
? TIMERPROC lpTimerFunc?? // 回調函數
); 例如
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函數了。 然后在函數里添加代碼,讓代碼實現功能。
每隔一段時間(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(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, 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?? // 回調函數
); 例如
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函數了。 然后在函數里添加代碼,讓代碼實現功能。
每隔一段時間(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(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;
}
總結
以上是生活随笔為你收集整理的MFC中OnTimer函数的使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: psnr 计算
- 下一篇: 技术人员如何"正确"的浪费时间?