?? 09.3.2 定時器的處理.txt
字號:
9.3.2 定時器的處理
接下來設置定時器。本例設置間隔 1000毫秒觸發一次定時器消息,因此,在
CMainFrame類的 OnCreate函數中添加如例如9所示代碼中加灰顯示的那行代碼。例 9-9
int CMainFrarne : :OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// TODO : Delete these three lines if you don ' t want the toolbar t o
/ / be dockable
m_wndTool Bar . EnableDocking(CBRS_ALIGN_ANY) ;
EnableDocking(CBRS_ALIGN_ANY) ;
DockControlBar(&m_ wndToolBar) ;
SetClassLong(m_hWnd, GCL_H工 CON, (LONG)Loadlcon(NULL , IDI_ERROR)) ;
m_hlcons [0] =Loadlcon(AfxGet工 nstanceHandle(), MAKEINTRESOURCE(工 DI _ ICON1) )
m_hlcons[l]=Loadlcon(theApp .m_hlnstance , MAKEINTRESOURCE(IDI_ ICON2)) ;
m_hlcons [2]=Loadlcon(AfxGetApp()->m_ hlnst ance , MAKEINTRESOURCE(IDI_ ICON3));
SetTimer(1 , 1000 , NULL);
return 0 ;
然后,為 CMainFrame類添加定時器消息 (WM一TIMER )的響應函數,并在該響應函數中調用
SetClassLong函數改變應用程序窗口的圖標。具體代碼如例 9-10所示。
19IJ 9-10
void CMa inFrame : :OnTimer(UINT n工 DEvent)
// TODO : Add your rnessage handler code here and/or call default
static int i ndex =O ;
SetClassLong (m_hWnd , GCL_HICON , (LONG)m_hicons[index]) ;
index=++;
index < 3 ;
CFrarneWnd : :OnTimer(nIDEvent) ;
上述例如 10所示代碼中,首先定義了一個國標索引變量 : index,并將其初始化為 0。然后調用
SetClassLong函數改變窗口的圖標。本例是要循環顯示三幅圖標,因此 index這個索引值就需要在
0, 1和 2這三個值之間循環變化。并且因為程序每次發送定時器消息后,就會調用 OnTimer這個響
應函數,因此應該把 index變量定義為靜態的。作為一個靜態的局部變量,它將存放在程序的數據
區中,而不是在按中分配空間。當第一次調用 OnTimer函數時,系統會在數據區中為 index變量分
配空間,并根據它的定義將其初始化為 0。當以后再次調用 OnTimer函數時,因為 index變量的空
間已經存在了,程序將直接引用該地
址中己有的值。當然,本例也可以把 index變量定義為 CMainFrame類的成員變量。
E 小技巧:如果希望把某個數值始終限定在一個范圍內,那么最好的辦法當
然就是進行取模運算(% )。例如,如果希望某個變量的取值在 0-10之間變化,因為 0-10之間有 11
個數,所以就應該把這個變量對 11取模。實際上,取模運算就是取余。
另外,在上述如例弘 10所示代碼中, SetClassLong函數的第三個參數需要一個 LONG型的值,而
m_hIcons[index]是 HICON類型,因此需要進行一個強制轉換。 Build并運行 Sty]e程序,將會發現
程序初始啟動時,顯示的是應用程序原來的圖標,然后就會動態地依次循環顯示我們自定義的三幅
圖標。
如果希望應用程序啟動后不再顯示原來的圖標,而是直接顯示我們自定義的圖標,在上述例 9-10
所示 CMainPrame類的 OnCreate函數中,在加載圖標之后,就應該調用 SetClassLong函數將應用程
序的圖標設置為我們自定義的第一幅圖標,結果如例 9-11所示。
例 9-11 .
int CMainFrarne : : OnCreate(LPCREATESTRUCT lpCreateStruct)
{
11 TODO : Delete these three lines if you don't want the toolbar to
11 be dockable
rn_wndToolBar . EnableDocking(CBRS_ALIGN_ANY) ;
EnableDocking(CBRS_AL工 GN一卻~Y) ;
DockControlBar(&rn_ wndToolBar) ;
SetClassLong(ffi_ hWnd,GCL_HICON , (LONG) Loadlcon (NULL,工 DI_ERROR) ) ;
ffi_hlcons[O]=Loadlcon(AfxGetlnstanceHandle() , MAKEINTRESOURCE(IDI_ICONl)) ,
ffi_hlcons[l]=Load工 con(theApp . ffi_hlnstance, MAKEINTRESOURCE(IDI_ICON2)) ;
ffi_hlcons[2]=Loadlcon(AfxGetApp()->ffi_hlnstance , MAKEINTRESOURCE(IDI_ ICON3
) ) ., SetClassLong(m_hWnd, GCL_HICON , (LONG)ffi_ hlcons[O]); SetTimer(1 , 1000 , NULL) ;
return 0 ;
因為現在自定義圖標數組中的第一幅圖標已經被設置為窗口初始的圖標了,在程序運行后應該接著
顯示第二幅圖標,所以在 OnTimer函數中,應該將 index變量的初始值修改為 1。之后,讀者可以
再次運行一下 Style程序,看看程序現在的圖標,將會發現程序一啟動就顯示了我們自定義的第一
幅圖標,沒有再顯示原來的圖標了,然后會依次循環顯示自定義的三幅圖標。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -