MFC 將 Win32 DC 封裝為四大類別,皆繼承自 CDC:
| 類別 | 建構/取得方式 | 釋放方式 | 適用範圍 | 特點 |
|---|---|---|---|---|
CClientDC | 建構時 GetDC() | 解構時 ReleaseDC() | 客戶區 | 最常用,自動管理生命週期 |
CWindowDC | 建構時 GetWindowDC() | 解構時 ReleaseDC() | 整個視窗(含非客戶區) | 可繪製標題列、邊框、捲軸等 |
CPaintDC | OnPaint 中建構 | 解構時 EndPaint() | 客戶區 | 回應 WM_PAINT 專用,含無效區資訊 |
CMetaFileDC | Create() / CreateEnhanced() | Close() / CloseEnhanced() | 中繼檔 | 建立 .wmf/.emf 向量圖檔 |
// 1. CClientDC - 最常用
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
// 自動 ReleaseDC
// 2. CWindowDC - 整個視窗
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
// 3. 桌面 DC - 跨進程繪製
CWindowDC dc(CWnd::GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
// 4. 低層 SDK 風格(不推薦)
/*
HDC hdc = ::GetDC(m_hWnd);
::MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, nullptr);
::LineTo(hdc, point.x, point.y);
::ReleaseDC(m_hWnd, hdc);
*/
CClientDCCWindowDCOnPaint 處理器 → CPaintDCCMetaFileDC