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

Windows GDI 設備場景 (DC) API 完整參考指南

     編輯:關於C++

概述

設備場景(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 / RestoreDCDC 狀態堆疊儲存/還原 (含映射模式、剪裁區、筆刷、字體等)
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 反查視窗控制代碼

實務建議

  1. 原則:GetDC 配 ReleaseDC;Create* 配 DeleteDC — 絕不可混用
  2. 雙緩衝:CreateCompatibleDC + CreateCompatibleBitmap + SelectObject + BitBlt
  3. 高 DPI:使用 MM_HIMETRIC 或 MM_TWIPS 邏輯單位,搭配 SetWindowExtEx/SetViewportExtEx 實現裝置無關繪圖
  4. 剪裁優化:WM_PAINT 開始前呼叫 GetClipBox 檢查實際需繪製區域,避免無效繪圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved