【GDI】CClientDC 和 CDC 的區別

HDC是Windows的一種數據類型,是設備描述句柄。

CDC是MFC封裝的Windows 設備相關的一個類。

CClientDC是CDC的衍生類,產生對應於Windows客戶區的對象,在構造時調用GetDC,在析構時調用ReleaseDC。

CWindowDC也是CDC的衍生類,在構造的時候調用GetWindowDC,在析構時調用ReleaseDC,可訪問CWnd的整個屏幕,包括客戶區和非客戶區。

以畫線爲例,上面幾種DC的使用代碼如下:

HDC hDC;
hDC = ::GetDC(m_hWnd);
MoveToEx(hDC, m_ptOrigin.x, m_ptOrigin.y, NULL);
LineTo(hDC, point.x, point.y);
::ReleaseDC(m_hWnd, hDC);
CDC *pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
CClientDC dc(this);
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
//CWindowDC dc(this);                    //this代表只能在view區域繪畫
//CWindowDC dc(GetParent());             //在整個frame區域繪畫
CWindowDC dc(GetDesktopWindow());        //可在整個桌面區域繪畫
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

------------------------------------------------------------------------------------------------------------------------------------

CDC

CDC是Windows繪圖設備的基類


CClientDC

(客戶區設備上下文)用於客戶區的輸出,與特定窗口關聯,可以讓開發者訪問目標窗口中客戶區,其構造函數中包含了GetDC,析構函數中包含了ReleaseDC。

CClientDC *pDC = new CClientDC(this);

 

CPaintDC

1、用於響應窗口重繪WM_PAINT消息時的繪圖輸出。

2、CPaintDC在構造函數中調用BeginPaint()取得設備上下文,在析構函數中調用EndPaint()釋放設備上下文。EndPaint()除了釋放設備上下文外,還負責從消息隊列中清除WM_PAINT消息。因此,在處理窗口重畫時,必須使用CPaintDC,否則WM_PAINT消息無法從消息隊列中清除,將引起不斷的窗口重畫。
3、CPaintDC也只能用在WM_PAINT消息處理之中。

 

CWindowDC

1、可在非客戶區繪製圖形,而CClientDC,CPaintDC只能在客戶區繪製圖形。
2、座標原點是在屏幕的左上角,CClientDC,CPaintDC下座標原點是在客戶區的左上角。
3、關聯一特定窗口,允許開發者在目標窗口的任何一部分進行繪圖,包含邊界與標題,這種DC同WM_NCPAINT消息一起發送。

CWindowDC dc(this); 

注意:在繪圖時推薦使用CClientDC、CPaintDC和CWindowDC對象,而不推薦直接使用CDC對象。



 

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