HDC,CDC,CWindowDC,CClientDC,CPaintDC基礎

首先說一下什麼是DC(設備描述表)
解:Windows應用程序通過爲指定設備(屏幕,打印機等)創建一個設備描述表(Device Context, DC)在DC表示的邏輯意義的“畫布”上進行圖形的繪製。DC是一種包含設備信息的數據結構,它包含了物理設備所需的各種狀態信息。Win32程序在繪製圖形之前需要獲取DC的句柄HDC,並在不繼續使用時釋放掉。
c++ 編程中常會見到HDC,CDC,CClientDC,CPaintDC,CWindowDC這樣的類
HDC是DC的句柄,API中的一個類似指針的數據類型.
CDC是MFC的DC的一個類
CDC等設備上下分類,都含有一個類的成員變量:m_nHdc;即HDC類型的句柄.
CDC及其派生類的繼承視圖:
CObject
public |------CDC
public |------|------CClientDC
public |------|------CPaintDC
public |------|------CWindowDC
public |------|------CMetaFileDC
(注意: 除CMetaFileDC以外的三個派生類用於圖形繪製.)
CDC類定義了一個設備描述表相關的類,其對象提供成員函數操作設備描述表進行工作,如顯示器,打印機,以及顯示器描述表相關的窗口客戶區域。
通過CDC的成員函數可進行一切繪圖操作。CDC提供成員函數進行設備描述表的基本操作,使用繪圖工具,選擇類型安全的圖形設備結構(GDI),以及色彩,調色板。除此之外還提供成員函數獲取和設置繪圖屬性,映射,控制視口,窗體範圍,轉換座標,區域操作,裁減,劃線以及繪製簡單圖形(橢圓,多邊形等)。成員函數也提供繪製文本,設置字體,打印機換碼,滾動,處理元文件。

 

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消息處理之中。

Detach();}CWindowDC:關聯一特定窗口,允許開發者在目標窗口的任何一部分進行繪圖,包含邊界與標題,這種DC同WM_NCPAINT消息一起發送

CWindowDC與CClientDC,CPaintDC的區別:CWindowDC可在非客戶區繪製圖形,而CClientDC,CPaintDC只能在客戶區繪製圖形。CWindowDC下座標原點是在屏幕的左上角,CClientDC,CPaintDC下座標原點是在客戶區的左上角。CClientDC與CPaintDC的區別:

CPaintDC的對象一般用在OnPaint內以響應Windows消息WM_PAINT,自動完成繪製,在整個窗口內進行重畫,維持原有窗口完整性。CClientDC應用在非響應Windows消息WM_PAINT的情況下,進行實時繪製,繪製的區域內被重畫。

 

CPaintDC(百度百科)

CPaintDC

CObject

CDC

└CPaintDC

CPaintDC類是一個來自CDC的設備環境類。它在構造期間執行CWnd::BeginPaint,在析構期間執行CWnd::EndPaint。

一個CPaintDC對象只在響應一個WM_PAINT消息的時候被使用,通常是在你的OnPaint消息處理成員函數中。

#include

CPaintDC類成員

數據成員

m_ps
包含了用於畫客戶區的PAINTSTRUCT

m_hWnd
CPaintDC對象所附着的HWND

構造函數

CPaintDC
構造一個連接到指定的CWnd上的CPaintDC對象

CPaintDC::m_ps

說明:

m_ps是一個PAINTSTRUCT類型的公有成員變量。它是一個由CWnd::BeginPaint傳遞和填充的PAINTSTRUCT。

這個PAINTSTRUCT包含了應用程序用來繪製與CPaintDC對象相關的窗口的客戶區信息。

注意,你可以通過PAINTSTRUCT來訪問設備環境句柄。但是,你可以更直接地通過m_hDC成員變量來訪問這個句柄,m_hDC是CPaintDC從CDC繼承來的。

CPaintDC::m_hWnd

說明:是CPaintDC對象所附着的HWND。m_hWnd是一個HWND類型的被保護變量。

CPaintDC::CPaintDC

CPaintDC( CWnd* pWnd );

throw( CResourceException );

參數:

pWnd
指向一個CPaintDC對象所屬的CWnd對象。

說明:

構造一個CPaintDC對象,準備用於繪畫的應用程序窗口,並將PAINTSTRUCT結構保存在m_ps成員變量中。

如果Windows GetDC調用失敗,則拋出一個異常(CResourceException類型)。

如果Windows已經分配了它所有的可利用的設備環境,則沒有可用的設備環境了。在Windows下,你的應用程序在給定時刻競爭五個可用的公共顯示環境。

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