MFC中OnTimer函数的使用方法
生活随笔
收集整理的這篇文章主要介紹了
MFC中OnTimer函数的使用方法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
OnTimer()函數(shù)用于實(shí)現(xiàn)定時控制功能,定時控制功能主要由下面三個函數(shù)共同實(shí)現(xiàn):
? HWND hWnd,????????????? // 窗口句柄
? UINT_PTR nIDEvent,????? // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器
? UINT uElapse,?????????? // 時間間隔,單位為毫秒
? TIMERPROC lpTimerFunc?? // 回調(diào)函數(shù)
); 例如
SetTimer(m_hWnd,1,1000,NULL); //一個1秒觸發(fā)一次的定時器
在MFC程序中SetTimer被封裝在CWnd類中,調(diào)用就不用指定窗口句柄了 于是SetTimer函數(shù)的原型變?yōu)?#xff1a; UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)) 當(dāng)使用SetTimer函數(shù)的時候,就會生成一個計(jì)時器。 SetTimer函數(shù)中 nIDEvent指的是計(jì)時器的標(biāo)識,也就是名字。 nElapse指的是時間間隔,也就是每隔多長時間觸發(fā)一次事件。 第三個參數(shù)是一個回調(diào)函數(shù),在這個函數(shù)里,放入你想要做的事情的代碼,你可以將它設(shè)定為NULL,也就是使用系統(tǒng)默認(rèn)的回調(diào)函數(shù),系統(tǒng)默認(rèn)的是OnTime函數(shù)。 這個函數(shù)怎么生成的呢? 你需要在需要計(jì)時器的類的生成onTime函數(shù):
在ClassWizard里,選擇需要計(jì)時器的類,添加WM_TIME消息映射,就自動生成OnTime函數(shù)了。 然后在函數(shù)里添加代碼,讓代碼實(shí)現(xiàn)功能。
每隔一段時間(SetTimer設(shè)置的時間)就會自動執(zhí)行一次。 例: SetTimer(1,1000,NULL); 1:計(jì)時器的名稱; 1000:時間間隔,單位是毫秒; NULL:使用onTime函數(shù)。 當(dāng)不需要計(jì)時器的時候調(diào)用KillTimer(nIDEvent); 例如:KillTimer(1);? //此處的ID號“1 ”應(yīng)與SetTimer()中的ID號一致 如果需要要加入兩個或者兩個以上的 timer怎么辦??
繼續(xù)用SetTimer函數(shù)吧,上次的timer的ID是1,這次可以是2,3,4...... SetTimer(2,1000,NULL); //ID為2,定時1000ms
SetTimer(3,500,NULL);?? //ID為3,定時500ms
WINDOWS會協(xié)調(diào)他們的。當(dāng)然OnTimer函數(shù)體也要發(fā)生變化,要在函數(shù)體內(nèi)添加每一個timer的處理代碼:?
OnTimer(nIDEvent)?
{?
??? switch(nIDEvent)?
??? {?
???????? case 1:........;?
???????????? break;?
???????? case 2:.......;?
???????????? break;?
???????? case 3:......;?
???????????? break;?
???? }?
}?
在控制臺中使用定時器不能簡單的SetTimer了事,這在控制臺里這種SetTimer的方式是有點(diǎn)麻煩的,需要自己寫消息循環(huán)投遞WM_TIMER消息。其實(shí)在控制臺里可以使用多媒體時鐘來計(jì)時:?
example:?
//啟動計(jì)時器?
MMRESULT?nIDTimerEvent?=?timeSetEvent(?
??1000,//延時1秒?
???0,?
??TimeProc,?
??0,?
??(UINT)TIME_PERIODIC);?
if(?nIDTimerEvent?==?0?)?
??cout<<"啟動計(jì)時器失敗"<<endl;?
//回調(diào)過程(時鐘到來,回調(diào)函數(shù)被系統(tǒng)自動調(diào)用)?
void?CALLBACK?TimeProc(?
??UINT?uID,???????
??UINT?uMsg,?????
??DWORD?dwUser,???
??DWORD?dw1,?????
??DWORD?dw2???????
)?
{?
??cout<<"時鐘到來"<<endl;?
???
}?
?
當(dāng)然了,你要是習(xí)慣于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是設(shè)置一個計(jì)時器并開始執(zhí)行計(jì)時器Ontimer中的代碼,Ontimer是計(jì)時器所執(zhí)行的代碼。KillTimer用于停止計(jì)時器。
或者說Settimer是設(shè)置定時器的,Ontimer是響應(yīng)Settimer消息的。當(dāng)Settimer設(shè)置的時間到了,就會自動調(diào)動Ontimer()函數(shù)。
先了解下SetTimer這個API函數(shù)的原型
UINT_PTR SetTimer(? HWND hWnd,????????????? // 窗口句柄
? UINT_PTR nIDEvent,????? // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器
? UINT uElapse,?????????? // 時間間隔,單位為毫秒
? TIMERPROC lpTimerFunc?? // 回調(diào)函數(shù)
); 例如
SetTimer(m_hWnd,1,1000,NULL); //一個1秒觸發(fā)一次的定時器
在MFC程序中SetTimer被封裝在CWnd類中,調(diào)用就不用指定窗口句柄了 于是SetTimer函數(shù)的原型變?yōu)?#xff1a; UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)) 當(dāng)使用SetTimer函數(shù)的時候,就會生成一個計(jì)時器。 SetTimer函數(shù)中 nIDEvent指的是計(jì)時器的標(biāo)識,也就是名字。 nElapse指的是時間間隔,也就是每隔多長時間觸發(fā)一次事件。 第三個參數(shù)是一個回調(diào)函數(shù),在這個函數(shù)里,放入你想要做的事情的代碼,你可以將它設(shè)定為NULL,也就是使用系統(tǒng)默認(rèn)的回調(diào)函數(shù),系統(tǒng)默認(rèn)的是OnTime函數(shù)。 這個函數(shù)怎么生成的呢? 你需要在需要計(jì)時器的類的生成onTime函數(shù):
在ClassWizard里,選擇需要計(jì)時器的類,添加WM_TIME消息映射,就自動生成OnTime函數(shù)了。 然后在函數(shù)里添加代碼,讓代碼實(shí)現(xiàn)功能。
每隔一段時間(SetTimer設(shè)置的時間)就會自動執(zhí)行一次。 例: SetTimer(1,1000,NULL); 1:計(jì)時器的名稱; 1000:時間間隔,單位是毫秒; NULL:使用onTime函數(shù)。 當(dāng)不需要計(jì)時器的時候調(diào)用KillTimer(nIDEvent); 例如:KillTimer(1);? //此處的ID號“1 ”應(yīng)與SetTimer()中的ID號一致 如果需要要加入兩個或者兩個以上的 timer怎么辦??
繼續(xù)用SetTimer函數(shù)吧,上次的timer的ID是1,這次可以是2,3,4...... SetTimer(2,1000,NULL); //ID為2,定時1000ms
SetTimer(3,500,NULL);?? //ID為3,定時500ms
WINDOWS會協(xié)調(diào)他們的。當(dāng)然OnTimer函數(shù)體也要發(fā)生變化,要在函數(shù)體內(nèi)添加每一個timer的處理代碼:?
OnTimer(nIDEvent)?
{?
??? switch(nIDEvent)?
??? {?
???????? case 1:........;?
???????????? break;?
???????? case 2:.......;?
???????????? break;?
???????? case 3:......;?
???????????? break;?
???? }?
}?
在控制臺中使用定時器不能簡單的SetTimer了事,這在控制臺里這種SetTimer的方式是有點(diǎn)麻煩的,需要自己寫消息循環(huán)投遞WM_TIMER消息。其實(shí)在控制臺里可以使用多媒體時鐘來計(jì)時:?
example:?
//啟動計(jì)時器?
MMRESULT?nIDTimerEvent?=?timeSetEvent(?
??1000,//延時1秒?
???0,?
??TimeProc,?
??0,?
??(UINT)TIME_PERIODIC);?
if(?nIDTimerEvent?==?0?)?
??cout<<"啟動計(jì)時器失敗"<<endl;?
//回調(diào)過程(時鐘到來,回調(diào)函數(shù)被系統(tǒng)自動調(diào)用)?
void?CALLBACK?TimeProc(?
??UINT?uID,???????
??UINT?uMsg,?????
??DWORD?dwUser,???
??DWORD?dw1,?????
??DWORD?dw2???????
)?
{?
??cout<<"時鐘到來"<<endl;?
???
}?
?
當(dāng)然了,你要是習(xí)慣于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;
}
總結(jié)
以上是生活随笔為你收集整理的MFC中OnTimer函数的使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: psnr 计算
- 下一篇: 技术人员如何"正确"的浪费时间?