M F C用C D C類封裝了一個設備環境對象, CDC的成員變量m _ h d c指向它所擁有的設備環境,用戶可以創建四種類型的設備環境: ■ 屏幕。 ■ 打印機。 ■ 只有打印機的信息部分。 ■ 位圖。 創建一個屏幕設備環境,可以用: CDC * pDC=GetDC( ); 這裏的GetDC( )是CWnd類的成員函數,它返回一個允許用戶繪製它的窗口客戶區的設備 環境;如果還希望繪製非客戶區,則使用: CDC *pDC=GetWindowDC( ); 如果需要繪製整個屏幕,如編寫一個屏幕保護程序或遊戲程序時,可能需要對整屏進行 繪製,這時使用: CDC *pDC=CDC::FromHandle (::GetDC (NULL)); 屏幕設備環境來自三種資源之一:私有設備環境、類設備環境和通用設備環境。 1. 私有設備環境 創建窗口時,私有設備環境便創建了,並在窗口存在期間一直存在。要使窗口創建一個 私有設備環境,必須在目標窗口的窗口類中設置C S _ O W N D C標誌,這時GetDC( )返回一個私有設備環境的指針,而不創建一個設備環境。在窗口存在期間,爲私有設備環境所作的任何變化都被保存。私有設備環境主要在以圖形爲中心的應用程序中使用,在那裏經常地分配一 個設備環境,這樣會佔用非常多的C P U時間。 2. 類設備環境 類設備環境在註冊一個窗口類時創建,並在窗口類的存在期間一直存在。要使窗口類創 建它自己的類設備環境,必須設置C S _ C L A S S D C標誌,GetDC( )只返回指向該類設備環境的指針。此外,在窗口類的存在期間,設備環境一直保留它的值。然而,在第1章中已提及,必須注意不要讓兩個由相同的窗口類創建的窗口在同一時間繪圖;還應注意M i c r o s o f t認爲一個類設備環境是舊用法。 3. 通用設備環境 在一個通用資源堆中使用GetDC( )時,一個通用設備環境便創建了。要獲得一個通用設 備環境,不要在窗口類中設置C S _ O W N D C或C S _ C L A S S D C。對於更早版本的Wi n d o w s,操作系統本身只有五個預分配的通用設備環境,因此取名G e t D C ( )與CreateDC( )相對應。必須保證在用完設備環境後釋放它,否則系統將發生衝突並導致異常終止。雖然設備環境是被創建的,但內存資源還是有限的,因此在使用一個通用設備環境後,仍需用下面語句釋放它: ReleaseDC (pDC); 注意私有設備環境和類設備環境不必釋放。 用戶最有可能用通用設備環境來做繪圖工作。每次釋放一個通用設備環境時,爲它們設 置的值都被丟失。但是,可以用下面兩個C D C成員函數保存和恢復一個設備環境的設置值: ■ S a v e D C ( )保存設備環境的當前狀態。 ■ RestoreDC( )將設備環境恢復到用SaveDC( )保存的狀態。 打印機 要爲打印機創建一個設備環境,必須先創建一個C D C類對象,然後使用它的CreateDC( ) 成員函數: CDC dc; dc.CreateDC(LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lpszOutput, const void* lpInitData) ■ l p s z D r i v e r N a m e是打印機所用的設備驅動程序(如“H P D RV”)。 ■ l p s z D e v i c e N a m e是進行打印的打印機設備的名字(如“HP Laserjet III”),設備驅動程序可以支持多種類型設備 ■ l p s z O u t p u t指定設備的串口名(如,“LPT1 :”)。 ■ lpInitData是任何設備專用的初始化數據。 使用打印機設備環境之後,必須用CDC類的DeleteDC ( )成員函數銷燬它。但是,若在堆 棧中創建CDC類,則程序返回時,設備環境自動被刪除。 CMyClass : : Drawing(。。。) { CDC dc; dc . CreateDC(。。。) ; } // CDC object and Device Context destroyed 要創建一個可以直接繪製位圖的設備環境,必須先用C D C的CreateCompatibleDC( )成員 函數創建一個C D C類對象。 CDC dc; dc.CreateCompatibleDC(HDC hdc); CreateCompatibleDC( )用設備環境的設置值初始化它所創建的設備環境對象,因此,取 名兼容D C。應該從顯示被創建的位圖的設備(如屏幕、打印機)傳遞一個設備環境。 要真實地繪製一個位圖,還必須創建一個空位圖對象,並使該設備環境與該位圖相關聯。 CDC dc; // create CDC object CBitmap bitmap; // create CBitmap object d c . C r e a t e C o m p a t i b l e D C ( p D C ) ; // create Device Context object bitmap.CreateCompatibleBitmap(pDC, ICON_WIDTH, ICON_HEIGHT); // create Bitmap object d c . S e l e c t O b j e c t ( & b i t m a p ) ; // point memory Device Context // to this bitmap 繪製位圖以後,必須用下列語句刪除設備環境: d c.DeleteDC( ); 信息 C D C提供的最後一種設備環境類型是打印機的信息部分。 CDC dc; d c . C r e a t e I C ( ) ; 這裏的調用變量與CreateDC( )中一樣。 信息設備環境只包含一臺打印機或其他非屏幕設備的特性,如顏色支持等。創建信息設 備環境的速度比創建一個常規的打印機設備環境速度快,因爲它只包含設備的特性。信息使 用後應當刪除,與前面描述的一樣。 注意正如C W n d類和它控制的窗口一樣,C D C類可以用Attach( )把自己捆綁到一個已 有的設備環境上,並可用Detach( )解開自己。創建一個封裝已有的設備環境的臨時 C D C對象,可以用FromHandle( )。但是,當應用程序進入空閒循環時,這一臨時類對 象將被刪除。
CWnd::GetDC
CDC* GetDC( );
返回值: 如果調用成功,則返回CWnd客戶區的設備環境;否則,返回NULL。這個指針可能是臨時的,不能被保存以供將來使用。
說明: 這個函數獲得一個指針,指向一個客戶區的公用的、屬於類的或者私有的設備環境,依賴於爲CWnd指定的類風格。對於公用的設備環境,GetDC每次獲得設備環境時都給它賦予缺省值。對於屬於類的或者私有的設備環境,GetDC保持原來的屬性不變。在隨後的圖形設備接口(GDI)函數中可以使用設備環境以在客戶區中繪圖。 除非設備環境屬於一個窗口類,否則在繪圖之後必須調用ReleaseDC成員函數以釋放設備環境。由於在同一時刻只有五個公用設備環境可供使用,因此如果釋放設備環境時失敗,可能導致其它應用程序不能訪問設備環境。 如果在註冊窗口類的時候,在WNDCLASS的風格中指定了CS_CLASSDC,CS_OWNDC或CS_PARENTDC,則GetDC成員函數將返回屬於CWnd類的設備環境。
例如:
CDC* pDC=GetDC();
|