?? 18.1.5 時鐘控件的實現.txt
字號:
18.1.5 時鐘控件的實現
下面繼續完成Clock控件的實現,讓該控件顯示系統當前時間,這可以在CClockCtrl類的OnDraw函數中完成。這時,該函數中已經自動生成了兩行代碼,分別用來填充控件的背景和繪制橢圓,我們先將這兩行代碼注釋起來,然后添加下述如例 18-2所示代碼中加灰顯示的代碼。
例18-2
void CClockCtrl :: OnDraw (CDC* pdc , const CRect& rcBounds , const CRect& rclnvalid)
/ / TODO : Replace the following code with your own draw工ng code.
//pdc->FIllRect(rcBounds, Brush : : FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))) ; // pdc->Ellipse(rcBounds);
CTime time=CTime::GetCurrentTime() ;
CString str=time.Format("%H:%M:%S" ) ;
pdc->TextOut(0 , 0, str);
如果想要獲得當前系統時間,可以使用CTime類的靜態方法: GetCurrentTime,該函數將返回表示系統當前時間的CTime對象,之后就可以利用CTime對象的Format方法對得到的CTime類型的時間進行格式化,返回一個CString對象,然后將表示時間的字符串顯示在控件窗口中。當控件需要刷新時,就會調用OnDraw函數,并傳遞一個CDC*類型的指針變量,在此函數中就可以利用該指針完成窗口的繪制工作。本例利用該指針在控件窗口 (0, 0)位置處顯示格式化后得到的時間字符串。
在VC++開發環境中,利用Build命令生成Clock控件程序,井運行該程序,因為先前我們已經選定了ActiveX Control Test Container應用程序來執行該控件,所以這時會自動啟動該程序,然后利用【Edit飛Insert New Con位01..】菜單項插入Clock控件,這時就可以看到在Clock控件的窗口上顯示了系統的當前時間,如圖 18.21所示。
圖 18.21控件窗口上顯示系統當前時間
可是,這時控件顯示的時間是靜止的,為了讓該時間"動起來飛前面介紹過解決方法,就是設置一個定時器,讓它每隔一秒鐘發送一個 WM TIMER消息,在響應該定時器的消息處理函數中,讓該控件刷新,重新輸出當前系統時間。另外,根據前面的知識,我們知道可以在控件窗口創建完成之后設置定時器,為此我們需要為 CClockCtrl類增加 WM CREATE消息的處理函數,然后在此函數中,在控件窗口創建完成之后,調用SetTimer函數創建定時器。具體代碼如例 18-3所示。
例 18-3
int CClockCtrl : :OnCreate(LPCREATESTRUCT 1pCreateStruct)
if (ColeControl :: OnCreate(lpCreateStruct) -1)
return -1;
11 TODO : Add your specialized creation code here
SetTimer(1 , 1000 , NULL) ;
return 0;
接下來,再為 CC1ockCtr1類增加 Windows消息: WM TIMER的處理,在其響應函數 OnTimer中調用 Invalidate函數,使窗口無效,這樣就可以使窗口重繪。具體實現代碼如例 18-4所示。
19IJ 18-4
void CClockCtrl : : OnT工mer(U工NT nIDEvent)
11 TODO: Add your message handler code here and/ or call defaul t
Invalidate ( ) ;
COleControl: : OnTi mer(n工DEvent) ;
Build井運行 Clock控件,在隨后打開的 ActiveX Control Test Container應用程序中插入該控件,將會看到這時這個時鐘控件顯示的時間隨系統當前時間而變化了。
另外,還可以調用另一個函數讓控件窗口重繪,這個函數是 InvalidateControl,這是 COleContro1類的一個成員函數,該函數的原型聲明如下所示:
void InvalidateControl( LPCRECT lpRect = NULL );
調用 InvalidateContro1函數可以強制控件重繪自身,如果它的參數是 NULL.那么整個控件都將被重繪。因此,在上述代碼中,可以將 Invalidate函數替換為InvalidateControl函數。然后,讀者可以測試程序,將會發現 C10ck控件顯示的結果是一樣的。當然,也可以在 VB中測試這個 Clock控件,會看到同樣的結果。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -