首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 設備描述表 (DC) 完全掌握:從 API 到 MFC 封裝類的繪圖實戰

     編輯:VC 教學

DC 核心概念

Windows 繪圖不直接操作硬體,而是繪製到裝置描述表 (Device Context, DC) 所代表的邏輯顯示平面。DC 封裝了 GDI 所需的所有繪圖屬性:關聯的物理裝置、筆刷、字型、映射模式、裁剪區域等。繪圖前必須取得 DC 句柄 (HDC),繪畢後釋放。

四種取得/釋放 DC 的層級封裝

1. 純 API 層級

// 整個螢幕 DC
HDC hDC = ::GetDC(NULL);
::MoveToEx(hDC, 0, 0, NULL);
::LineTo(hDC, 200, 20);
::ReleaseDC(NULL, hDC);

// 特定視窗 DC
HDC hDC = ::GetDC(hWnd);
// ... 繪圖 ...
::ReleaseDC(hWnd, hDC);

2. MFC CWnd 成員函數

CDC* pDC = GetDC();          // 取得用戶區 DC
pDC->MoveTo(0, 0);
pDC->LineTo(200, 100);
ReleaseDC(pDC);                // 釋放

3. MFC DC 封裝類別(RAII 風格,建構/解構自動管理)

類別適用範圍典型使用場景
CClientDC視窗用戶區一般繪圖、即時回饋
CPaintDC用戶區僅限 OnPaint 回應 WM_PAINT,內部自動 BeginPaint/EndPaint
CWindowDC整個視窗(含非用戶區)繪製標題列、邊框、跨視窗座標
// 範例:CClientDC 繪製紅色矩形
CClientDC dc(this);
CBrush brush(RGB(255,0,0));
dc.FillRect(CRect(0,0,100,100), &brush);

// 範例:CWindowDC 繪製綠色對角線
CWindowDC dc(this);
CPen pen(PS_SOLID, 3, RGB(0,255,0));
CPen* pOld = dc.SelectObject(&pen);
dc.MoveTo(0,0); dc.LineTo(200,200);
dc.SelectObject(pOld);

4. 堆積配置 DC 指標(需手動 delete)

CWindowDC* pDC = new CWindowDC(this);
pDC->MoveTo(0,0); pDC->LineTo(200,250);
delete pDC; // 解構時自動 ReleaseDC

關鍵差異與選擇指南

  • CClientDC:最常用,對應 GetDC/ReleaseDC,適用於非 WM_PAINT 時機的即時繪圖。
  • CPaintDC:只能 用於 OnPaint,對應 BeginPaint/EndPaint,支援重繪區域最佳化。
  • CWindowDC:座標原點在視窗左上角(含標題列),適合跨邊界繪圖。
  • 所有 DC 類別解構時自動釋放資源,符合 RAII 原則,杜絕洩漏。

實戰建議

日常開發優先使用 CClientDC / CPaintDC 等封裝類;唯有與舊代碼互操作或特殊 GDI 物件管理時,才直接操作 HDC 與 ::GetDC/ReleaseDC。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved