MFC定時器使用

2022-05-13 03:21:45 字數 3245 閱讀 8521

方法一:cwnd類提供的成員函式settimer實現定時器功能,只能在cwnd類或其派生類中呼叫。

方法二:windows api函式settimer來實現。

啟動定時器就需要使用cwnd類的成員函式settimer。cwnd::settimer的原型如下:

uint_ptr settimer(

uint_ptr nidevent,//指定乙個非零的定時器id

uint nelapse,//指定間隔時間,單位為毫秒

void (callback* lpfntimer)(hwnd,

uint,

uint_ptr,

dword

)//指定乙個**函式的位址,

//如果該引數為null,則wm_timer訊息被傳送到應用程式的訊息佇列,並被cwnd物件處理。

//引數lpfntimer如果此函式成功則返回乙個新的定時器的id,我們可以使用此id通過killtimer成員函式來銷毀該定時器,如果函式失敗則返回0。

);

1 通過wm_timer訊息的訊息響應函式

2 通過**函式

如果要啟動多個定時器就多次呼叫settimer成員函式。另外,在不同的cwnd中可以有id相同的定時器,並不衝突。

如果呼叫cwnd::settimer函式時最後乙個引數為null,則通過wm_timer的訊息處理函式來處理定時事件。新增wm_timer訊息的處理函式的方法是,在vs2010工程的class view類檢視中找到要新增定時器的類,點選右鍵,選擇properties,顯示其屬性頁,然後在屬性頁工具欄上點選messages按鈕,下面列表就列出了所有訊息,找到wm_timer訊息,新增訊息處理函式。新增後,cpp檔案中會出現類似如下內容:

begin_message_map(cexample44dlg, cdialogex)  

......  

on_wm_timer()  

end_message_map()  

void cexample44dlg::ontimer(uint_ptr nidevent)  

之後就可以在ontimer函式中進行相應的處理了。ontimer的引數nidevent為定時器id,即在settimer成員函式中指定的定時器id,如果有多個定時器,我們可以像下面這樣處理:

void cexample44dlg::ontimer(uint_ptr nidevent)     

cdialogex::ontimer(nidevent);     

}    

如果呼叫cwnd::settimer函式時最後乙個引數不為null,則需要定義**函式。**函式的形式如下:

void callback export timerproc(  

hwnd hwnd, // handle of cwnd that called settimer

uint nmsg, // wm_timer

uint nidevent // timer identification

dword dwtime // system time

); 

引數hwnd為呼叫settimer成員函式的cwnd物件的控制代碼,即擁有此定時器的視窗的控制代碼;引數nmsg為wm_timer,而且總是為wm_timer;引數nidevent為定時器id;引數dwtime為系統啟動以來的毫秒數,即gettickcount函式的返回值。

這樣cwnd::settimer函式最後乙個引數就可以為timerproc。**函式的名稱不一定為timerproc,可以取其他名字,但返回值型別、引數的型別和個數不能改變。**函式為全域性函式,需要寫在使用它的位置的前面,或者寫在後面然後在使用之前宣告。

銷毀定時器需使用cwnd類的killtimer成員函式,cwnd::killtimer函式的原型如下:

bool killtimer(uint_ptr nidevent); 

引數nidevent為要銷毀的定時器的id,是呼叫cwnd::settimer函式時設定的定時器id。如果定時器被銷毀則返回true,而如果沒有找到指定的定時器則返回false。如果要銷毀多個定時器,則多次呼叫killtimer函式並分別傳入要銷毀的定時器的id。

使用api函式settimer啟動定時器,settimer函式的原型如下:

uint_ptr settimer(        

hwnd       hwnd,   //與定時器關聯的視窗的控制代碼

uint_ptr  nidevent,   //非零的定時器id,如果hwnd等於null,且還不存在id為nidevent的定時器,那麼nidevent引數被忽略,然後生成乙個新id的定時器,而如果hwnd不為null,且hwnd指定的視窗已存在id為nidevent的定時器,那麼這個已存在的定時器被新定時器所取代。

uint           uelapse,   //cwnd::settimer函式

timerproc    lptimerfunc   //cwnd::settimer函式

如果呼叫settimer函式時最後乙個引數為null,我們需要自己為wm_timer訊息新增處理函式,要注意的是,wm_timer訊息的附加資料wparam為定時器id,lparam為**函式的指標,如果呼叫settimer時**函式為null,那麼lparam也為null。

而如果呼叫settimer函式時最後乙個引數不為null,我們就需要定義**函式。**函式的定義同mfc定時器。

銷毀定時器使用killtimer api函式,原型如下:

bool killtimer(hwnd hwnd,uint_ptr uidevent);  

引數hwnd為與定時器關聯的視窗的控制代碼,與啟動定時器時settimer函式的hwnd引數值相同;引數uidevent為要銷毀的定時器的id,如果傳遞給settimer的引數hwnd有效,則uidevent應與傳遞給settimer的引數nidevent相同,而如果settimer的引數hwnd為null,則uidevent應為settimer返回的定時器id。該函式成功則返回true,否則返回false。

定時器使用

dword winapi checksendinfovector lpvoid lpparameter return 0 void callback dotimer hwnd hwnd,uint umsg,uint ptr idevent,dword dwtime timerproc的引數hwnd是...

Delphi Timer定時器使用

timer定時器是乙個非視覺化元件,能夠定時觸發ontimer事件,完成模擬時鐘 系統延時 倒計時等工作。在system選項卡中。1 timer的主要屬性 1 enabled屬性 當值為true時,開啟定時器,否則關閉定時器。預設值為true。2 interval屬性 控制ontimer事件觸發的時...

workman定時器使用

workerman 定時器例子,可單獨使用,稍加改善可以開啟乙個守護程序,用來做一些定時發布等等類似的任務,使用方便,不需要額外的擴充套件或者類似 crontab 等工具。以下是測試程式 php view plain copy use workerman autoloader use workerm...