概述
設備場景(Device Context,簡稱 DC)是 Windows GDI 繪圖系統的核心抽象,封裝了繪圖屬性、模式設定與輸出目標資訊。本文系統整理 DC 建立/管理、座標轉換、剪裁區域、映射模式、視口/視窗控制 等核心 API 函數,並按功能分類說明用途與關鍵參數。
一、DC 建立、取得與釋放
| 函數 | 用途 | 關鍵說明 |
GetDC | 取得視窗客戶區 DC | 最常用,繪圖完需呼叫 ReleaseDC |
GetDCEx | 進階取得視窗 DC | 提供裁剪、父視窗等額外選項 |
GetWindowDC | 取得整個視窗 DC (含非客戶區) | 包含標題列、選單、捲軸、邊框 |
CreateDC | 為特定裝置建立 DC | 直接指定驅動程式、裝置名、輸出埠 |
CreateCompatibleDC | 建立記憶體 DC | 與既有 DC 相容,離螢幕繪圖/雙緩衝必備 |
CreateIC | 建立資訊場景 | 僅查詢裝置能力,不輸出像素 |
DeleteDC | 刪除 DC 並釋放資源 | 僅適用 CreateDC/CreateCompatibleDC/CreateIC 建立的 DC |
ReleaseDC | 釋放 GetDC/GetWindowDC 取得的 DC | 不可用於 Create* 系列建立的 DC |
二、座標空間與映射模式
核心概念
- 邏輯座標:應用程式使用的座標系統
- 裝置座標:實體裝置 (螢幕/印表機) 的像素座標
- 映射模式:定義邏輯→裝置座標的轉換規則
座標轉換 API
| 函數 | 方向 | 說明 |
DPtoLP | 裝置 → 邏輯 | 陣列點批次轉換 |
LPtoDP | 邏輯 → 裝置 | 陣列點批次轉換 |
映射模式控制
| 函數 | 用途 |
SetMapMode / GetMapMode | 設定/取得映射模式 (MM_TEXT, MM_LOMETRIC, MM_HIMETRIC, MM_TWIPS 等) |
SetWindowExtEx / GetWindowExtEx | 設定/取得視窗範圍 (邏輯單位) |
SetWindowOrgEx / GetWindowOrgEx | 設定/取得視窗原點 (邏輯單位) |
SetViewportExtEx / GetViewportExtEx | 設定/取得視口範圍 (裝置單位/像素) |
SetViewportOrgEx / GetViewportOrgEx | 設定/取得視口原點 (裝置單位/像素) |
ScaleWindowExtEx / ScaleViewportExtEx | 縮放視窗/視口範圍 |
OffsetWindowOrgEx / OffsetViewportOrgEx | 平移視窗/視口原點 |
三、剪裁區域管理
剪裁區域限制繪圖輸出範圍,預設為整個視窗客戶區。
| 函數 | 操作類型 | 說明 |
SelectClipRgn | 選入新剪裁區 | 取代現有剪裁區 |
ExtSelectClipRgn | 組合剪裁區 | 支援 RGN_AND/OR/XOR/DIFF/COPY 模式 |
IntersectClipRect | 矩形交集 | 建立新剪裁矩形 |
ExcludeClipRect | 排除矩形 | 從剪裁區移除指定矩形 |
ExcludeUpdateRgn | 排除更新區 | 移除視窗無效區 |
OffsetClipRgn | 平移剪裁區 | 指定水平/垂直位移量 |
GetClipRgn | 取得目前剪裁區 | 需預先建立區域物件 |
GetClipBox | 取得剪裁區外接矩形 | 快速檢查可繪製範圍 |
四、區域物件操作
| 建立函數 | 形狀類型 |
CreateRectRgn/CreateRectRgnIndirect | 矩形 |
CreateRoundRectRgn | 圓角矩形 |
CreateEllipticRgn/CreateEllipticRgnIndirect | 橢圓/內切橢圓 |
CreatePolygonRgn | 單一多邊形 |
CreatePolyPolygonRgn | 多個多邊形 (各自封閉) |
| 操作/查詢函數 | 功能 |
CombineRgn | 兩區域布爾運算合併 (RGN_AND/OR/XOR/DIFF/COPY) |
OffsetRgn | 平移區域 |
GetRgnBox | 取得區域外接矩形 |
EqualRgn | 比較兩區域是否相等 |
PtInRegion / RectInRegion | 點/矩形是否在區域內 |
PtVisible / RectVisible | 點/矩形是否在 DC 剪裁區內可見 |
FillRgn / FrameRgn / PaintRgn / InvertRgn | 填充/畫框/背景色填充/反相區域 |
GetRegionData | 取得區域內部資料結構 |
ExtCreateRegion | 依世界轉換修改區域 |
五、世界轉換 (World Transform) — 進階繪圖
需先呼叫 SetGraphicsMode(hdc, GM_ADVANCED) 啟用。
| 函數 | 功能 |
SetWorldTransform / GetWorldTransform | 設定/取得 3x3 轉換矩陣 (平移、旋轉、縮放、剪切) |
ModifyWorldTransform | 依指定模式 (MWT_LEFTMULTIPLY/MWT_RIGHTMULTIPLY) 修改現有轉換 |
CombineTransform | 合併兩個轉換矩陣 |
六、DC 狀態管理與邊界
| 函數 | 用途 |
SaveDC / RestoreDC | DC 狀態堆疊儲存/還原 (含映射模式、剪裁區、筆刷、字體等) |
GetBoundsRect / SetBoundsRect | 取得/設定 DC 繪圖累積邊界矩形 |
GetDCOrgEx | 取得 DC 原點在螢幕座標位置 |
七、裝置能力查詢
GetDeviceCaps(hdc, nIndex) 是查詢裝置硬體特性的萬用鑰匙,常用索引值:
- 解析度:
LOGPIXELSX, LOGPIXELSY (DPI)
- 實體尺寸:
HORZSIZE, VERTSIZE (mm), HORZRES, VERTRES (像素)
- 色彩能力:
BITSPIXEL, PLANES, NUMCOLORS, RASTERCAPS
- 曲線/文字能力:
CURVECAPS, LINECAPS, TEXTCAPS
八、視窗更新與捲動
| 函數 | 用途 |
GetUpdateRgn / InvalidateRgn / ValidateRgn | 取得/設定/清除視窗無效區 (觸發 WM_PAINT) |
ScrollDC | 在 DC 中捲動矩形區域內容 |
WindowFromDC | 從 DC 反查視窗控制代碼 |
實務建議
- 原則:
GetDC 配 ReleaseDC;Create* 配 DeleteDC — 絕不可混用
- 雙緩衝:
CreateCompatibleDC + CreateCompatibleBitmap + SelectObject + BitBlt
- 高 DPI:使用
MM_HIMETRIC 或 MM_TWIPS 邏輯單位,搭配 SetWindowExtEx/SetViewportExtEx 實現裝置無關繪圖
- 剪裁優化:
WM_PAINT 開始前呼叫 GetClipBox 檢查實際需繪製區域,避免無效繪圖