Windows 繪圖不直接操作硬體,而是繪製到裝置描述表 (Device Context, DC) 所代表的邏輯顯示平面。DC 封裝了 GDI 所需的所有繪圖屬性:關聯的物理裝置、筆刷、字型、映射模式、裁剪區域等。繪圖前必須取得 DC 句柄 (HDC),繪畢後釋放。
// 整個螢幕 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);
CWnd 成員函數CDC* pDC = GetDC(); // 取得用戶區 DC
pDC->MoveTo(0, 0);
pDC->LineTo(200, 100);
ReleaseDC(pDC); // 釋放
| 類別 | 適用範圍 | 典型使用場景 |
|---|---|---|
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);
CWindowDC* pDC = new CWindowDC(this);
pDC->MoveTo(0,0); pDC->LineTo(200,250);
delete pDC; // 解構時自動 ReleaseDC
GetDC/ReleaseDC,適用於非 WM_PAINT 時機的即時繪圖。OnPaint,對應 BeginPaint/EndPaint,支援重繪區域最佳化。日常開發優先使用 CClientDC / CPaintDC 等封裝類;唯有與舊代碼互操作或特殊 GDI 物件管理時,才直接操作 HDC 與 ::GetDC/ReleaseDC。