国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
VS2010/MFC編程入門之四十四(MFC常用類:定時器Timer)

       前面一節(jié)雞啄米講了CTime類和CTimeSpan類的使用,本節(jié)繼續(xù)講與時間有關(guān)的定時器。定時器并不是一個類,主要考慮到,提起時間的話就不能不說定時器,所以就把它放到CTime和CTimeSpan之后講解。

       定時器簡介

       定時器,可以幫助開發(fā)者或者用戶定時完成某項任務(wù)。在使用定時器時,我們可以給系統(tǒng)傳入一個時間間隔數(shù)據(jù),然后系統(tǒng)就會在每個此時間間隔后觸發(fā)定時處理程序,實現(xiàn)周期性的自動操作。例如,我們可以在數(shù)據(jù)采集系統(tǒng)中,為定時器設(shè)置定時采集時間間隔為1個小時,那么每隔1個小時系統(tǒng)就會采集一次數(shù)據(jù),這樣就可以在無人操作的情況下準確的進行操作。

       MFC定時器

       VS2010編程中,我們可以使用MFC的CWnd類提供的成員函數(shù)SetTimer實現(xiàn)定時器功能,也可以使用Windows API函數(shù)SetTimer來實現(xiàn)。兩者使用方法實際上很類似,但也有不同。

       CWnd類的SetTimer成員函數(shù)只能在CWnd類或其派生類中調(diào)用,而API函數(shù)SetTimer則沒有這個限制,這是一個很重要的區(qū)別。因為本教程主要是講解MFC編程,所以這里就先重點講解MFC定時器的用法,關(guān)于API函數(shù)SetTimer的用法雞啄米會在MFC定時器講解的基礎(chǔ)上進行延伸。

       雞啄米下面分步驟給出使用MFC定時器的方法。

       1、啟動定時器。

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

       UINT_PTR SetTimer(
             UINT_PTR nIDEvent,
             UINT nElapse,
             void (CALLBACK* lpfnTimer
       )(HWND,
          UINT,
          UINT_PTR,
          DWORD
       )
       );

       參數(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工程的Class View類視圖中找到要添加定時器的類,點擊右鍵,選擇Properties,顯示其屬性頁,然后在屬性頁工具欄上點擊Messages按鈕,下面列表就列出了所有消息,找到WM_TIMER消息,添加消息處理函數(shù)。添加后,cpp文件中會出現(xiàn)類似如下內(nèi)容:

C++代碼
  1. BEGIN_MESSAGE_MAP(CExample44Dlg, CDialogEx)   
  2.     ......   
  3.     ON_WM_TIMER()   
  4. END_MESSAGE_MAP()   
  5.   
  6. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)   
  7. {   
  8.     // TODO: Add your message handler code here and/or call default   
  9.   
  10.     CDialogEx::OnTimer(nIDEvent);   
  11. }  

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

C++代碼
  1. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)      
  2. {      
  3.     // TODO: Add your message handler code here and/or call default      
  4.     switch (nIDEvent)      
  5.     {      
  6.     case 1:      
  7.         // 如果收到ID為1的定時器的消息則調(diào)用func1函數(shù)      
  8.         func1();      
  9.         break;      
  10.     case 2:      
  11.         // 如果收到ID為2的定時器的消息則調(diào)用func2函數(shù)      
  12.         fun2();    
  13.        break;     
  14.     ......      
  15.     default:      
  16.         break;      
  17.     }      
  18.      
  19.     CDialogEx::OnTimer(nIDEvent);      
  20. }     

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

C++代碼
  1. void CALLBACK EXPORT TimerProc(   
  2.   
  3. HWND hWnd, // handle of CWnd that called SetTimer   
  4.   
  5. UINT nMsg, // WM_TIMER   
  6.   
  7. UINT nIDEvent // timer identification   
  8.   
  9. DWORD dwTime // system time   
  10.   
  11. );  

       參數(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++代碼
  1. void CALLBACK EXPORT TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)      
  2. {      
  3.    switch(nTimerid)      
  4.    {      
  5.    case 1:       
  6.          // 處理ID為1的定時器的事件      
  7.          func1();      
  8.          break;      
  9.    case 2:       
  10.          // 處理ID為2的定時器的事件      
  11.          func2();      
  12.          break;    
  13.    ......   
  14.    default:   
  15.         break;     
  16.    }      
  17. }     

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

       3、銷毀定時器。

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

C++代碼
  1. BOOL KillTimer(UINT_PTR nIDEvent);  

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

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

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

       如果我們不使用MFC定時器,而通過Windows API函數(shù)使用定時器,其實是很類似的。下面雞啄米簡單說下步驟吧。

       1、啟動定時器。

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

C++代碼
  1. UINT_PTR SetTimer(         
  2.     HWND    
  3.             hWnd,   
  4.     UINT_PTR    
  5.             nIDEvent,   
  6.     UINT    
  7.             uElapse,   
  8.     TIMERPROC    
  9.             lpTimerFunc   
  10. );  

       參數(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++代碼
  1. BOOL KillTimer(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。

       MFC定時器應(yīng)用實例

       雞啄米給大家演示一個定時器的例子,該實例功能很簡單,就是使用兩個定時器,定時更新兩個編輯框中的顯示內(nèi)容,第一個編輯框每秒刷新一次,從1刷新到10,然后銷毀定時器,第二個編輯框每兩秒刷新一次,從1刷新到5,然后銷毀定時器。下面簡單說下步驟:

       1、創(chuàng)建基于對話框的工程,名稱設(shè)為“Example44”。

       2、在自動生成的對話框模板IDD_EXAMPLE44_DIALOG中,刪除“TODO: Place dialog controls here.”靜態(tài)文本控件。添加兩個靜態(tài)文本框控件,Caption分別設(shè)為“1秒鐘刷新一次”和“2秒鐘刷新一次”,再添加兩個個Edit Control控件,ID使用默認的IDC_EDIT1和IDC_EDIT2,兩者的Read Only屬性都設(shè)為True。此時的對話框模板如下圖:

       3、為CExample44Dlg類添加兩個成員變量,分別為m_nData1、m_nData2,并在CExample44Dlg類的構(gòu)造函數(shù)中初始化:

C++代碼
  1. CExample44Dlg::CExample44Dlg(CWnd* pParent /*=NULL*/)   
  2.     : CDialogEx(CExample44Dlg::IDD, pParent)   
  3. {   
  4.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);   
  5.     // 兩個數(shù)據(jù)初始化為0   
  6.     m_nData1 = 0;   
  7.     m_nData2 = 0;   
  8. }  

       4、在對話框模板上雙擊OK按鈕,添加點擊消息的處理函數(shù),并修改如下:

C++代碼
  1. void CExample44Dlg::OnBnClickedOk()   
  2. {   
  3.     // TODO: Add your control notification handler code here   
  4.     // 啟動ID為1的定時器,定時時間為1秒   
  5.     SetTimer(1, 1000, NULL);   
  6.     // 啟動ID為2的定時器,定時時間為2秒   
  7.     SetTimer(2, 2000, NULL);   
  8.   
  9.     //CDialogEx::OnOK();   
  10. }  

       這樣,點擊OK按鈕時就不會退出,而是啟動兩個定時器。

       5、根據(jù)上面MFC定時器講解中為WM_TIMER消息添加處理函數(shù)的方法,添加WM_TIMER的消息處理函數(shù)OnTimer,并修改其實現(xiàn)如下:

C++代碼
  1. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)   
  2. {   
  3.     // TODO: Add your message handler code here and/or call default   
  4.     switch (nIDEvent)   
  5.     {   
  6.     case 1:   
  7.         // 如果m_nData1已經(jīng)達到10,則銷毀ID為1的定時器   
  8.         if (10 == m_nData1)   
  9.         {   
  10.             KillTimer(1);   
  11.             break;   
  12.         }   
  13.         // 刷新編輯框IDC_EDIT1的顯示   
  14.         SetDlgItemInt(IDC_EDIT1, ++m_nData1);   
  15.         break;   
  16.     case 2:   
  17.         // 如果m_nData2已經(jīng)達到5,則銷毀ID為2的定時器   
  18.         if (5 == m_nData2)   
  19.         {   
  20.             KillTimer(2);   
  21.             break;   
  22.         }   
  23.         // 刷新編輯框IDC_EDIT2的顯示   
  24.         SetDlgItemInt(IDC_EDIT2, ++m_nData2);   
  25.     default:   
  26.         break;   
  27.     }   
  28.   
  29.     CDialogEx::OnTimer(nIDEvent);   
  30. }  

       6、運行程序,點擊OK按鈕,查看效果。

       關(guān)于定時器的內(nèi)容就講這些,相信了解了這些,一般的定時器應(yīng)用都能解決了。雞啄米謝謝大家一直以來的陪伴,讓我有動力更新下去!!

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
settimer,ontimer,killtimer功能
OnTimer()&SetTimer() -- 叛逆的天空 -- 編程愛好者博客
MFC TIMER
MFC中計時器的編寫
VC中定時器的使用_VC技術(shù)文章_VC_軟件編程
Windows WM_TIMER消息
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服