Windows GDI 繪圖核心在於「畫筆」勾勒輪廓、「畫刷」填充內部。本文系統介紹 `SetPixel`/`GetPixel` 像素操作、`CPen` 畫筆樣式與建立、`CBrush` 實體/斜紋畫刷建立,並列舉基本繪圖函數,助你掌握 MFC 繪圖基本功。
像素操作(慎用)
- `COLORREF SetPixel(int x, int y, COLORREF crColor)`:設定像素顏色,回傳原顏色
- `COLORREF GetPixel(int x, int y)`:取得像素顏色
效能警告:逐點繪圖極慢,大面積填充請改用畫刷或 `BitBlt`。
畫筆 CPen
建立:`BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor)`
| 樣式常數 | 說明 | 寬度限制 |
| PS_SOLID | 實線 | 任意 |
| PS_DASH | 虛線 | 僅 1 |
| PS_DOT | 點線 | 僅 1 |
| PS_DASHDOT | 點劃線 | 僅 1 |
| PS_DASHDOTDOT | 雙點劃線 | 僅 1 |
| PS_NULL | 空筆(不畫) | — |
| PS_ENDCAP_ROUND | 端點圓形 | — |
| PS_ENDCAP_SQUARE | 端點方形 | — |
使用流程:建立 `CPen` → `dc.SelectObject(&pen)` 選入 DC → 繪圖 → `dc.SelectObject(oldPen)` 恢復。
畫刷 CBrush
建立方式:
- `BOOL CreateSolidBrush(COLORREF crColor)`:純色畫刷
- `BOOL CreateHatchBrush(int nIndex, COLORREF crColor)`:斜紋畫刷
斜紋樣式(`nIndex`):
- HS_HORIZONTAL / HS_VERTICAL / HS_FDIAGONAL / HS_BDIAGONAL / HS_CROSS / HS_DIAGCROSS
系統繪製封閉圖形(`Ellipse`、`Rectangle`、`Polygon`、`RoundRect`、`Chord`、`Pie`)時,自動用當前畫刷填充內部。
基本繪圖函數速查
- `MoveTo(x, y)` / `LineTo(x, y)`:直線
- `Rectangle(x1, y1, x2, y2)`:矩形
- `Ellipse(x1, y1, x2, y2)`:橢圓/圓
- `RoundRect(x1, y1, x2, y2, x3, y3)`:圓角矩形
- `Polygon(points, count)`:多邊形
- `PolyLine(points, count)`:連續線段
資源管理鐵律
- GDI 物件(筆、刷、字型、位圖、區域)用完必須 `DeleteObject()` 或讓析構函數自動釋放
- 選入 DC 後,繪圖結束前務必 `SelectObject(oldObject)` 恢復原物件,否則導致 GDI 洩漏
- 堆疊建立的 `CPen`/`CBrush` 區域變數,離開作用域自動釋放,最安全