CDC類

 
CDC應用
 

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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章