MFC中OnTimer的應用
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;
}
相關文章
- mfc中的訊息的應用 (轉)
- MFC應用程式中處理訊息的順序
- 用MFC構造DirectX應用框架 (轉)框架
- 在MFC類中各種類的指標的獲取和應用指標
- Windows中OnTimer和執行緒Windows執行緒
- MFC開發(一)簡單同步時間應用程式
- Flink onTimer定時器定時器
- MFC框架中WM_COMMAND訊息響應順序框架
- 搭建通用 GUI 測試框架步驟,適用於 MFC/JAVA 應用程式GUI框架Java
- MFC中獲取程式自身的版本資訊
- 2.3 應用程式容器中的應用程式概述
- Visaul Studio 2015 MFC 應用程式工程建立
- JavaScript中AOP的應用JavaScript
- unix中dmesg的應用
- WORD中域的應用
- 如何讓MFC編寫的應用程式(用VC6.0開發)能在別的電腦上執行
- MFC中ListControl控制元件的使用控制元件
- MFC中OnDraw與OnPaint的區別 (轉載)AI
- VS2019/MFC程式設計入門之(如何利用MFC嚮導生成單文件應用程式框架)C程式程式設計框架
- 淺談 MFC 的子類化機制和該機制的一個應用(2) (轉)
- 淺談 MFC 的子類化機制和該機制的一個應用(1) (轉)
- Refs 在React中的應用React
- MQTT 在 Elixir 中的應用MQQT
- Js中Currying的應用JS
- HMM在NLP中的應用HMM
- SSD在SQLServer中的應用SQLServer
- action中json的應用JSON
- HugePage在mysql中的應用MySql
- HugePage在oracle中的應用Oracle
- SQL 中的統計應用SQL
- sar 在unix中的應用
- php當中的memcache應用PHP
- PLC程式中的配方應用C程式
- MFC訊息響應機制分析 (轉)
- MFC 對話方塊中動態建立N級選單以及響應事件事件
- 使用MFC的Windows 套接字應注意的幾個問題 (轉)Windows
- BurpSuite在非Web應用測試中的應用UIWeb
- Render函式在Vue多頁面應用中的應用函式Vue