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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

MFC定时器SetTimer函数用法总结

發(fā)布時間:2024/8/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC定时器SetTimer函数用法总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? CWnd類的SetTimer成員函數(shù)只能在CWnd類或其派生類中調(diào)用,而API函數(shù)SetTimer則沒有這個限制,這是一個很重要的區(qū)別。

1、啟動定時器。

?????? 啟動定時器就需要使用CWnd類的成員函數(shù)SetTimer。CWnd::SetTimer的原型如下:

??????

參數(shù)nIDEvent指定一個非零的定時器ID;

參數(shù)nElapse指定間隔時間,單位為毫秒;

參數(shù)lpfnTimer指定一個回調(diào)函數(shù)的地址,如果該參數(shù)為NULL,則WM_TIMER消息被發(fā)送到應(yīng)用程序的消息隊列,并被CWnd對象處理。如果此函數(shù)成功則返回一個新的定時器的ID,我們可以使用此ID通過KillTimer成員函數(shù)來銷毀該定時器,如果函數(shù)失敗則返回0。

?????? 通過SetTimer成員函數(shù)我們可以看出,處理定時事件可以有兩種方式,一種是通過WM_TIMER消息的消息響應(yīng)函數(shù),一種是通過回調(diào)函數(shù)。

?????? 如果要啟動多個定時器就多次調(diào)用SetTimer成員函數(shù)。另外,在不同的CWnd中可以有ID相同的定時器,并不沖突。

2、為WM_TIMER消息添加消息處理函數(shù),或者定義回調(diào)函數(shù)。

????? 如果調(diào)用CWnd::SetTimer函數(shù)時最后一個參數(shù)為NULL,則通過WM_TIMER的消息處理函數(shù)來處理定時事件。添加WM_TIMER消息的處理函數(shù)的方法是,在VS2010工程的類向?qū)?#xff0c;選擇要添加定時器的類,在消息列表中找到WM_TIMER消息,添加消息處理函數(shù)。添加后,cpp文件中會出現(xiàn)類似如下內(nèi)容:

C++代碼

BEGIN_MESSAGE_MAP(CExample44Dlg,CDialogEx)???

??? ......???

??? ON_WM_TIMER()???

END_MESSAGE_MAP()???

??

voidCExample44Dlg::OnTimer(UINT_PTR nIDEvent)???

{???

??? // TODO: Add your message handler code hereand/or call default???

??

??? CDialogEx::OnTimer(nIDEvent);???

}?

?????? 之后就可以在OnTimer函數(shù)中進(jìn)行相應(yīng)的處理了。OnTimer的參數(shù)nIDEvent為定時器ID,即在SetTimer成員函數(shù)中指定的定時器ID,如果有多個定時器,我們可以像下面這樣處理:

C++代碼

voidCExample44Dlg::OnTimer(UINT_PTR nIDEvent)??????

{// TODO: Add your message handler code here and/or call default??????

??? switch (nIDEvent)??????

{??????

case 1:??????

??????? //在這添加執(zhí)行定時器1的任務(wù);??????

??????? break;??????

??? ?case2:??????

?????? //在這添加執(zhí)行定時器2的任務(wù);?

?????? ?break;?????

??? ......??????

??? default:??????

??????? break;??????

??? }??????

??CDialogEx::OnTimer(nIDEvent);??????

}????

?

?????? 如果調(diào)用CWnd::SetTimer函數(shù)時最后一個參數(shù)不為NULL,則需要定義回調(diào)函數(shù)。回調(diào)函數(shù)的形式如下:

C++代碼


?????? 參數(shù)hWnd為調(diào)用SetTimer成員函數(shù)的CWnd對象的句柄,即擁有此定時器的窗口的句柄;參數(shù)nMsg為WM_TIMER,而且總是為WM_TIMER;參數(shù)nIDEvent為定時器ID;參數(shù)dwTime為系統(tǒng)啟動以來的毫秒數(shù),即GetTickCount函數(shù)的返回值。

?????? 這樣CWnd::SetTimer函數(shù)最后一個參數(shù)就可以為TimerProc。

?????? 注意:回調(diào)函數(shù)的名稱不一定為TimerProc,可以取其他名字,但返回值類型、參數(shù)的類型和個數(shù)不能改變。

?????? 回調(diào)函數(shù)的例子:

C++代碼

VOIDCALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)??????

{??????

?? switch(nTimerid)??????

?? {??????

?? case 1:???????

??????? ?// 處理ID為1的定時器的事件???????

???????? break;??????

?? case 2:???????

???????? // 處理ID為2的定時器的事件??????

???????? break;????

?? ......???

?? default:???

??????? break;?????

?? }??????

}????

?

?????? 回調(diào)函數(shù)為全局函數(shù),需要寫在使用它的位置的前面,或者寫在后面然后在使用之前聲明。

3、銷毀定時器。

???? ??不再使用定時器時,可以銷毀它。銷毀定時器需使用CWnd類的KillTimer成員函數(shù),CWnd::KillTimer函數(shù)的原型如下:

C++代碼

BOOLKillTimer(UINT_PTR nIDEvent);?

?

?????? 參數(shù)nIDEvent為要銷毀的定時器的ID,是調(diào)用CWnd::SetTimer函數(shù)時設(shè)置的定時器ID。如果定時器被銷毀則返回TRUE,而如果沒有找到指定的定時器則返回FALSE。

?????? 如果要銷毀多個定時器,則多次調(diào)用KillTimer函數(shù)并分別傳入要銷毀的定時器的ID。

4.MFC定時器經(jīng)典例子

實現(xiàn)功能:單擊對話框中的“開始計數(shù)”按鈕,編輯框中數(shù)字每個1s時間遞增顯示。

如下圖:


制作步驟:

1.??在VS2010中新建一個項目,命名為“Timer”,選擇MFC向?qū)Ы⒒趯υ捒?#xff1b;

2.??在自動生成的對話框模板中,刪除所有靜態(tài)文本控件和按鈕控件。添加一個編輯框控件和一個按鈕控件,使用默認(rèn)的IDC_EDIT1和IDC_BUTTON1,編輯框的ReadOnly屬性設(shè)置True。

3.??在CTimerDlg類的類向?qū)е?#xff0c;為編輯框IDC_EDIT1添加int類型成員變量m_CountTime和CEdit類型的m_Edit1對象。

在CTimerDlg類TimerDlg.h頭文件中找到

int? m_CountTime;將它修改為

static? int?m_CountTime;//靜態(tài)整形成員變量;

在CTimerDlg類TimerDlg.cpp源文件的構(gòu)造函數(shù)中刪除:

m_CountTime=0;

在CTimerDlg類TimerDlg.cpp源文件的頭文件下方添加:

int? CTimerDlg::m_CountTime=0;//在全局為靜態(tài)整形成員變量初始化;

int Num=0;//全局變量;

4.??在CTimerDlg類TimerDlg.cpp源文件中找到BOOLCTimerDlg::OnInitDialog()函數(shù)的// TODO: 在此添加額外的初始化代碼,在其下面添加:


注意:要調(diào)整好編輯框大小尺寸,以適應(yīng)設(shè)置的文本字體大小;

5. 在CTimerDlg類TimerDlg.cpp源文件中添加SetTimer函數(shù)中使用的回調(diào)函數(shù):


6. 雙擊“開始計時”按鈕,添加其消息處理函數(shù):



7. 在VS2010工程的類向?qū)?#xff0c;選擇CTimerDlg類,在消息列表中找到WM_CLOSE消息,為對話框右上角“關(guān)閉”按鈕添加消息處理函數(shù):


8.總結(jié):

① 在SetTimer函數(shù)的回調(diào)函數(shù)中,如果要使用類中的成員變量m_CountTime,則不僅需要把m_CountTime修改成靜態(tài)成員變量,而且還要在全局對m_CountTime初始化賦值。但是這樣雖然編譯無錯誤,但是不能實現(xiàn)每隔1s時間m_CountTime值自加。

②在全局定義了int Num=0;變量,在“開始計時”按鈕的消息處理函數(shù)中,將Num賦給m_CountTime,再將m_CountTime值顯示在編輯框中。在SetTimer函數(shù)的回調(diào)函數(shù)中讓Num自加的目的實現(xiàn)。

__________________________________________________________________________________________________________________________________________________________

附頁:

通過Windows API函數(shù)使用定時器

?????? 1、啟動定時器。

?????? 使用API函數(shù)SetTimer啟動定時器,SetTimer函數(shù)的原型如下:

C++代碼

UINT_PTRSetTimer(?????????

??? HWND????

??????????? hWnd,???

??? UINT_PTR????

??????????? nIDEvent,???

??? UINT????

??????????? uElapse,???

??? TIMERPROC????

??????????? lpTimerFunc???

);?

?

?????? 參數(shù)hWnd為與定時器關(guān)聯(lián)的窗口的句柄;參數(shù)nIDEvent為非零的定時器ID,如果hWnd等于NULL,且還不存在ID為nIDEvent的定時器,那么nIDEvent參數(shù)被忽略,然后生成一個新ID的定時器,而如果hWnd不為NULL,且hWnd指定的窗口已存在ID為nIDEvent的定時器,那么這個已存在的定時器被新定時器所取代。參數(shù)uElapse和lpTimerFunc同CWnd::SetTimer函數(shù)。

?????? 2、為WM_TIMER消息添加消息處理函數(shù),或者定義回調(diào)函數(shù)。

?????? 如果調(diào)用SetTimer函數(shù)時最后一個參數(shù)為NULL,我們需要自己為WM_TIMER消息添加處理函數(shù),要注意的是,WM_TIMER消息的附加數(shù)據(jù)wParam為定時器ID,lParam為回調(diào)函數(shù)的指針,如果調(diào)用SetTimer時回調(diào)函數(shù)為NULL,那么lParam也為NULL。

?????? 而如果調(diào)用SetTimer函數(shù)時最后一個參數(shù)不為NULL,我們就需要定義回調(diào)函數(shù)。回調(diào)函數(shù)的定義同MFC定時器。

?????? 3、銷毀定時器。

?????? 銷毀定時器使用KillTimer API函數(shù),原型如下:

C++代碼

BOOLKillTimer(HWND hWnd,UINT_PTR uIDEvent); ??

?????? 參數(shù)hWnd為與定時器關(guān)聯(lián)的窗口的句柄,與啟動定時器時SetTimer函數(shù)的hWnd參數(shù)值相同;參數(shù)uIDEvent為要銷毀的定時器的ID,如果傳遞給SetTimer的參數(shù)hWnd有效,則uIDEvent應(yīng)與傳遞給SetTimer的參數(shù)nIDEvent相同,而如果SetTimer的參數(shù)hWnd為NULL,則uIDEvent應(yīng)為SetTimer返回的定時器ID。該函數(shù)成功則返回TRUE,否則返回FALSE。


總結(jié)

以上是生活随笔為你收集整理的MFC定时器SetTimer函数用法总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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