MFC中的CDC,CClientDC,CPaintDC,CWindowDC的區別


轉自 http://blog.csdn.net/guoquan2003/article/details/4534716

CDC是Windows繪圖設備的基類。

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

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消息一起發送。

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

 

另附百度百科CClientDC相關內容:

類CClientDC派生於CDC,在構造時調用了Windows函數GetDC,在析構時調用了ReleaseDC。這意味着和CClientDC對象相關的設備上下文是窗口的客戶區。

幾種DC及區別

CClientDC:(客戶區 設備上下文)用於客戶區的輸出,與特定窗口關聯,可以讓開發者訪問目標窗口中客戶區,其 構造函數中包含了 GetDC, 析構函數中包含了 ReleaseDC
用法是:CClientDC dc(this);//this一般指向本窗口或當前活動視圖dc.TextOut(10,10,str,str.GetLength());//利用dc輸出文本,如果是在CScrollView中使用,還要注意調用 OnPrepareDC(&dc)調整設備上下文的坐標。 CPaintDC用於響應窗口重繪消息(WM_PAINT)時的繪圖輸出。CPaintDC在 構造函數中調用 BeginPaint()取得 設備上下文,在 析構函數中調用 EndPaint()釋放設備上下文。EndPaint()除了釋放設備上下文外,還負責從 消息隊列中清除 WM_PAINT消息。因此,在處理窗口重畫時,必須使用CPaintDC,否則WM_PAINT消息無法從消息隊列中清除,將引起不斷的窗口重畫。 CPaintDC也只能用在WM_PAINT消息處理之中。
CWindowDC:關聯一特定窗口,允許開發者在目標窗口的任何一部分進行繪圖,包含邊界與標題,這種DC同WM_NCPAINT消息一起發送
CWindowDC與CClientDC,CPaintDC的區別:CWindowDC可在非客戶區繪制圖形,而CClientDC,CPaintDC只能在客戶區繪制圖形。CWindowDC下坐標原點是在屏幕的左上角,CClientDC,CPaintDC下坐標原點是在客戶區的左上角。CClientDC與CPaintDC的區別:
CPaintDC的對象一般用在 OnPaint內以響應 Windows消息WM_PAINT,自動完成繪制,在整個窗口內進行重畫,維持原有窗口完整性。CClientDC應用在非響應Windows消息WM_PAINT的情況下,進行實時繪制,繪制的區域內被重畫。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM