CPaintDC、CClientDC、CWindowDC和CMetaFileDC類的主要特點及區別 1、 設備環境(DC) (1)在Windows中,顯示工作是基於設備環境的。所謂設備環境(DC)是一種Windows數據結構,該結構包含應用程序設備輸出時所需要的信息。 (2)在使用任何繪圖函數之前必須建立一個設備環境對象。 (3)在Visual C++ 6.0的MFC中提供了設備環境類CDC,它封裝了繪圖所需要的所有函數,其中包括了大多數的Windows API中的GDI函數。 2、 設備環境類 2.1. CDC類 (1)CDC類是CObject類的派生類,也是所有設備環境類的基類。CDC類定義了一個設備描述對象,並提供了對設備描述對象進行操作的成員函數以及對與窗口客戶區有關的顯示區進行操作的成員函數。 (2)CDC類提供的成員函數可以用於操作設備描述對象、使用繪圖工具、選擇圖形設備界面,以及操作顏色和調色板,還用於取得和設置繪圖屬性、映射方式、視圖和窗口范圍的操作、坐標的轉換、區域的使用、剪取、畫線以及繪制圖形和文字等操作。 2.2. CPaintDC類 (1)CPaintDC類是CDC類的一個派生類,該類一般用在響應WM_PAINT消息的函數OnPaint()中。 (2)WM_PAINT消息是當窗口的某個區域需要重畫時激發的窗口消息。當程序中的消息循環接到WM_PAINT消息時就自動調用消息處理函數OnPaint(),如果在OnPaint函數內定義了CPaintDC類的對象,通過這個類對象就可以使用CDC類的成員函數完成視圖客戶區中的圖形繪制操作。 (3)CPaintDC用於響應窗口重繪消息(WM_PAINT)時的繪圖輸出。CPaintDC在構造函數中調用BeginPaint()取得設備上下文,在析構函數中調用EndPaint()釋放設備上下文。EndPaint()除了釋放設備上下文外,還負責從消息隊列中清除WM_PAINT消息。因此,在處理窗口重畫時,必須使用CPaintDC,否則WM_PAINT消息無法從消息隊列中清除,將引起不斷的窗口重畫。CPaintDC也只能用在WM_PAINT消息處理之中。 2.3. CClientDC類 CClientDC類也是CDC類的派生類。它只能在窗口的客戶區(即窗口中除了邊框、標題欄、菜單欄以及狀態欄外的中間部分)中進行繪圖,坐標點(0,0)通常指的是客戶區的左上角。它的構造函數調用GegDC函數,而析構函數調用ReleaseDC函數。 CClientDC(客戶區設備上下文)用於客戶區的輸出,它在構造函數中封裝了GetDC(),在析構函數中封裝了ReleaseDC()函數。一般在響應非窗口重畫消息(如鍵盤輸入時繪制文本、鼠標繪圖)繪圖時要用到它。用法是: CClientDC dc(this);//this一般指向本窗口或當前活動視圖 dc.TextOut(10,10,str,str.GetLength()); //利用dc輸出文本,如果是在CScrollView中使用,還要注意調用OnPrepareDC(&dc)調整設備上下文的坐標。 2.4. CWindowDC類 CWindowDC類也是CDC類的派生類。其成員函數可以在窗口的客戶區和非客戶區(即窗口的邊框、標題欄、菜單欄以及狀態欄)中繪圖,坐標點(0,0)是指整個屏幕的左上角。同CClientDC類一樣,它的構造函數調用GegDC函數,而析構函數調用ReleaseDC函數。 2.5. CMdtaFileDC類 CMetaFileDC類提供了一個面向Windows圖元文件的設備環境,封裝了在一個Windows圖元文件中繪圖的方法。圖元文件是一個與設備無關的圖片的集合,由於它對圖像的保存比像素更精確,因而往往在要求較高的場合下使用,例如AutoCAD的圖形保存等。 3、幾個設備環境類的主要差別 3.1. CWindowDC類與CPaintDC 、CClientDC類的區別 其區別主要有以下兩個方面: (1)用CPaintDC 和CClientDC類的對象繪制圖形時,繪制區只能在客戶區,而不能在非客戶區;而CwindowDC類既可以在窗口的客戶區也可以在非客戶區進行圖形繪制。 (2)在CWindowDC繪圖類下,坐標系是建立在整個屏幕上的,在像素坐標方式下,坐標原點在屏幕的左上角;而在CPaintDC和CClientDC繪圖類下,坐標系是建立在客戶區上的,在像素坐標方式下,坐標原點在客戶區的左上角。 3.2. CPaintDC類與CClientDC類的區別 CPaintDC類的對象應用在OnPaint函數中,以響應Windows的WM_PAINT消息;而CClientDC類的對象應用在非響應消息WM_PAINT的情況下。 CPaintDC類響應WM_PAINT消息,並自動完成繪制,這對維護圖形的完整性有着重要的作用。CClientDC類可以實時地將圖形繪制到屏幕上,不需要重畫;而如果用CPaintDC類的對象完成同樣的工作,只能發出消息讓屏幕上包含這條直線的區域重畫,以把這條直線繪制到屏幕上。 4、設備環境類的使用方法 4.1. CDC類 因為CDC類不能用窗口對象指針初始化對象,所以,一般不直接定義對象。 4.2. CPaintDC類 CPaintDC 類一般用在窗口類OnPaint函數中,可采用如下代碼定義一個CPaintDC類對象: CPaintDC dc(this); 以上代碼定義了一個CPaintDC類的對象dc,並用當前的窗口對象指針this對對象進行了初始化。CClientDC和CWindowDC類也采用這樣的方法。 4.3. CClientDC類 可利用以下代碼定義一個對象:CClientDC dc(this); 4.4. CWindowDC 類 利用以下代碼創建一個CWindowDC類的對象:CWindowDC dc(this);