小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MFC中計(jì)時(shí)器的編寫

 寂靜如河 2012-02-28
 

最簡單的開始寫,毫秒級時(shí)鐘。

用CWnd::SetTimer設(shè)置定時(shí)器,然后在窗口上添加WM_TIMER事件,接下來實(shí)現(xiàn)OnTimer響應(yīng)函數(shù)就可以了...

SetTimer(1,1,NULL); // 第一個(gè)是定時(shí)器標(biāo)號,第二個(gè)是每隔多長時(shí)間運(yùn)行一次,單位毫秒,第三個(gè)本來是定時(shí)器處理函數(shù)的,這里用NULL的意思是直接使用OnTimer響應(yīng)函數(shù)...

void OnTimer( UINT nIDEvent ); // 響應(yīng)函數(shù)聲明

 

 

我把得到的當(dāng)前時(shí)間存到一個(gè)(cstring)str字符串內(nèi),然后用MessageBox顯示出來,然后我想把當(dāng)前時(shí)間減掉15分鐘存到另一個(gè)字符串str2內(nèi)再將其輸出,請問-15分鐘這個(gè)過程怎么實(shí)現(xiàn)?比如str存的時(shí)間為22:10分,我想在str2中存入11:55分,我要怎么做?

CTime   today=CTime::GetCurrentTime()   ; 
CTimeSpan   ts(0,0,15,0);//they   are   corresponding   with   the   variables:day,hour,minute,second 
CTime   date=today-ts; 
CString   ss=date.Format( "%Y-%m-%d   %H-%M-%S ");

1、MFC中的計(jì)時(shí)原理:
當(dāng)你需要每隔一段時(shí)間執(zhí)行一件事的的時(shí)候就需要使用SetTimer()函數(shù)了。 讓我們先來看看SetTimer函數(shù)的原型:
    UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))
當(dāng)使用SetTimer函數(shù)的時(shí)候,就會生成一個(gè)計(jì)時(shí)器。函數(shù)中nIDEvent指的是計(jì)時(shí)器的標(biāo)識,也就是名字。nElapse指的是時(shí)間間隔,也就是每隔多長時(shí)間觸發(fā)一次事件。第三個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),在這個(gè)函數(shù)里,放入你想要做的事情的代碼,你可以將它設(shè)定為NULL,也就是使用系統(tǒng)默認(rèn)的回調(diào)函數(shù),系統(tǒng)默認(rèn)認(rèn)的是onTime()函數(shù)。這個(gè)函數(shù)怎么生成的呢?你需要在需要計(jì)時(shí)器的類的生成onTime函數(shù):在ClassWizard里,選擇需要計(jì)時(shí)器的類,添加WM_TIME消息映射,就自動生成onTime函數(shù)了。然后在函數(shù)里添加代碼,讓代碼實(shí)現(xiàn)功能。每隔一段時(shí)間就會自動執(zhí)行一次。例: SetTimer(1,1000,NULL); 其中,1為計(jì)時(shí)器的名稱; 1000為時(shí)間間隔,單位是毫秒; NULL指使用onTime函數(shù)。
如果最后一個(gè)參數(shù)不是NULL,就調(diào)用TimerProc(),原型為:
void CALLBACK EXPORT TimerProc(
   HWND hWnd,      // handle of CWnd that called SetTimer
   UINT nMsg,      // WM_TIMER
   UINT nIDEvent   // timer identification
   DWORD dwTime    // system time
){}
 
 當(dāng)不需要計(jì)時(shí)器的時(shí)候調(diào)用KillTimer(nIDEvent); 例如:KillTimer(1); 或許你會問,如果我要加入兩個(gè)或者兩個(gè)以上的 timer怎么辦? 繼續(xù)用SetTimer函數(shù)吧,上次的timer的ID是1,這次可以是2,3,4。。。。 SetTimer(2,1000,NULL); SetTimer(3,500,NULL); 嗯,WINDOWS會協(xié)調(diào)他們的。當(dāng)然onTimer函數(shù)體也要發(fā)生變化,要在函數(shù)體內(nèi)添加每一個(gè)timer的處理代碼: onTimer(nIDEvent) { switch(nIDEvent) { case 1:........; break; case 2:.......; break; case 3:......; break; } }
小技巧:可以使用#define定義不同的計(jì)時(shí)器ID值。
#define TIME_SEC 1
#define TIME_MIN 2
然后調(diào)用SetTimer設(shè)定兩個(gè)計(jì)時(shí)器
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;SetTimer (hwnd, TIMER_MIN, 600, NULL)
2、API函數(shù)
(1)、SetTimer函數(shù)用于創(chuàng)建一個(gè)計(jì)時(shí)器,KillTimer函數(shù)用于銷毀一個(gè)計(jì)時(shí)器。計(jì)時(shí)器屬于系統(tǒng)資源,使用完應(yīng)及時(shí)銷毀。
SetTimer的函數(shù)原型如下:
UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ) ;
  其中
  hWnd是和timer關(guān)聯(lián)的窗口句柄,此窗口必須為調(diào)用SetTimer的線程所有;如果hWnd為NULL,沒有窗口和timer相關(guān)聯(lián)并且nIDEvent參數(shù)被忽略 
  nIDEvent是timer的標(biāo)識,為非零值;如果hWnd為NULL則被忽略;如果hWnd非NULL而且與timer相關(guān)聯(lián)的窗口已經(jīng)存在一個(gè)為此標(biāo)識的timer,則此次SetTimer調(diào)用將用新的timer代替原來的timer。timer標(biāo)識和窗口相關(guān),兩個(gè)不同的窗口可以擁有nIDEvent相同的timer 
  uElapse是以毫秒指定的計(jì)時(shí)間隔值,范圍為1毫秒到4,294,967,295毫秒(將近50天),這個(gè)值指示W(wǎng)indows每隔多久時(shí)間給程序發(fā)送WM_TIMER消息。 
  lpTimerFunc是一個(gè)回調(diào)函數(shù)的指針,俗稱TimerFunc;如果lpTimerFunc為NULL,系統(tǒng)將向應(yīng)用程序隊(duì)列發(fā)送WM_TIMER消息;如果lpTimerFunc指定了一個(gè)值,DefWindowProc將在處理WM_TIMER消息時(shí)調(diào)用這個(gè)lpTimerFunc所指向的回調(diào)函數(shù),因此即使使用TimerProc代替處理WM_TIMER也需要向窗口分發(fā)消息。
關(guān)于SetTimer的返回值:如果hWnd為NULL,返回值為新建立的timer的ID,如果hWnd非NULL,返回一個(gè)非0整數(shù),如果SetTimer調(diào)用失敗則返回0
KillTimer的函數(shù)原型為:BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ; 參數(shù)意義同SetTimer。 
  關(guān)于KillTimer對消息隊(duì)列中剩余未處理的WM_TIMER消息的影響,MSDN和Programming Windows上的說法完全相反。MSDN的說法很干脆:The KillTimer function does not remove WM_TIMER messages already posted to the message queue. 而petzold則說 The KillTimer call purges the message queue of any pending WM_TIMER messages. Your program will never receive a stray WM_TIMER message following a KillTimer call.(KillTimer消除消息隊(duì)列中任何未處理的WM_TIMER消息,調(diào)用KillTimer后你的程序永遠(yuǎn)不會收到一條“漂泊游蕩”的WM_TIMER消息)
2)、關(guān)于WM_TIMER消息
wParam為計(jì)時(shí)器的ID;如果需要設(shè)定多個(gè)計(jì)時(shí)器,那么對每個(gè)計(jì)時(shí)器都使用不同的計(jì)時(shí)器ID。wParam的值將隨傳遞到窗口過程中的WM_TIMER消息的不同而不同。
  lParam為指向TimerProc的指針,如果調(diào)用SetTimer時(shí)沒有指定TimerProc(參數(shù)值為NULL),則lParam為0(即NULL)。 
  可以通過在窗口過程中提供一個(gè)WM_TIMER case處理這個(gè)消息,或者,默認(rèn)窗口過程會調(diào)用SetTimer中指定的TimerProc來處理WM_TIMER消息
(3)、使用計(jì)時(shí)器的三種方法
如果在程序的整個(gè)執(zhí)行過程中使用計(jì)時(shí)器,一般在處理WM_CREATE消息時(shí)或WinMain中消息循環(huán)前調(diào)用SetTimer,在處理WM_DESTROY消息時(shí)或在WinMain中消息循環(huán)后return前調(diào)用KillTimer。根據(jù)SetTimer中的參數(shù)不同,有三種方法使用計(jì)時(shí)器。
方法一:調(diào)用SetTimer時(shí)指定窗口句柄hWnd,nIDEvent中指定計(jì)時(shí)器ID,將lpTimerFunc置NULL從而不使用TimerProc;在窗口過程中處理WM_TIMER消息。調(diào)用KillTimer時(shí),使用SetTimer中指定的hWnd和id。最好使用#define定義timer的id,例如:
#define ID_TIMER 1 
SetTimer(hWnd,ID_TIMER,1000,NULL) ;
KillTimer(hWnd,ID_TIMER) ;
方法二:調(diào)用SetTimer時(shí)指定窗口句柄hWnd,nIDEvent中指定計(jì)時(shí)器ID,lpTimerFunc參數(shù)不為NULL而指定為TimerProc函數(shù)的指針。這種方法使用TimerProc函數(shù)(名字可自定)處理WM_TIMER消息:
VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
 //處理WM_TIMER訊息 
}
TimerProc的參數(shù)hwnd是在調(diào)用SetTimer時(shí)指定的窗口句柄。Windows只把WM_TIMER消息送給TimerProc,因此消息參數(shù)總是等于WM_TIMER。iTimerID值是計(jì)時(shí)器ID,dwTimer值是與從GetTickCount函數(shù)的返回值相容的值。這是自Windows啟動后所經(jīng)過的毫秒數(shù)。使用這種方法時(shí),相關(guān)函數(shù)調(diào)用的形式為:
SetTimer(hWnd,ID_TIMER,1000,TimerProc) ;
KillTimer(hWnd,ID_TIMER) ;
方法三:調(diào)用SetTimer時(shí)不指定窗口句柄(為NULL),iTimerID參數(shù)自然被忽略,lpTimerFunc不為NULL而指定為TimerProc的指針。正如上面SetTimer的討論中所說的,此時(shí)SetTimer的返回值正是新建立的計(jì)時(shí)器的ID,需將這個(gè)ID保存以供KillTimer銷毀計(jì)時(shí)器時(shí)所用。當(dāng)然,KillTimer的hWnd參數(shù)也置為NULL。這種方法同樣用TimerProc處理WM_TIMER消息
UINT_PTR iTimerID ; 
iTimerID = SetTimer(NULL,0,1000,TimerProc) ;
KillTimer(NULL,iTimerID) ;
使用這種方法的好處是不必自己指定計(jì)時(shí)器ID,這樣就不必?fù)?dān)心用錯(cuò)ID。
(4)、使用多個(gè)計(jì)時(shí)器
使用多個(gè)計(jì)時(shí)器只要在建立計(jì)時(shí)器時(shí)指定不同的ID。比如用上面所述方法一時(shí)的情況:
#define TIMER_SEC 1
#define TIMER_MIN 2

然后使用兩個(gè)SetTimer來設(shè)定兩個(gè)計(jì)時(shí)器:
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;
SetTimer (hwnd, TIMER_MIN, 60000, NULL) ; 

WM_TIMER
的處理如下所示:
case WM_TIMER:
 switch (wParam)
 {
  case TIMER_SEC:
   //每秒一次的處理 
   break ;
  case TIMER_MIN:
   //每分鐘一次的處理
   break ;
 }
 return 0 ;

 

 

 

SetTimer(TIMEID1,5000,0);
SetTimer(TIMEID2,7000,0);
///////////////////////////////////
void CsysDlg::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 1:
AfxMessageBox(_T("1"));
break;
case 2:
AfxMessageBox(_T("2"));
break;
default:
AfxMessageBox(_T("d"));
break;
}
}
///////////////////////////////////
KillTimer(TIMEID1);
KillTimer(TIMEID2);
///////////////////////////////////
每五秒的時(shí)候做time1
每七秒做time2
settimer就是激活定時(shí)器
不用的計(jì)時(shí)器用KillTimer殺掉

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多