日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC中OnTimer函数的使用方法

發(fā)布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC中OnTimer函数的使用方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
OnTimer()函數(shù)用于實(shí)現(xiàn)定時控制功能,定時控制功能主要由下面三個函數(shù)共同實(shí)現(xiàn):

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。