| 對象類 | 核心屬性 | 典型用途 |
|---|---|---|
CFont | 字體名、字號、粗體、斜體、下劃線、字符集 | TextOut、DrawText 文字繪製 |
CBrush | 顏色、填充樣式(實心/斜線/交叉/自定義位圖) | FillRect、Ellipse 封閉圖形填充 |
CPen | 顏色、寬度、線型(實線/虛線/點線/點劃線) | MoveTo/LineTo、Rectangle 邊框繪製 |
CBitmap | 像素數據、寬高、色深、設備相關/無關(DIB) | BitBlt、StretchBlt 圖像繪製 |
CRgn | 矩形/橢圓/多邊形/組合區域 | 剪裁限制、非矩形窗口、命中測試 |
obj.CreateXxx(...) 或構造函數初始化。CGdiObject* pOld = pDC->SelectObject(&obj),必須保存舊對象指針。pDC->SelectObject(pOld) —— 關鍵步驟,防止 GDI 泄漏/崩潰。obj.DeleteObject()(析構函數自動調用,但重用前需手動刪除)。void CMyView::OnDraw(CDC* pDC) {
CPen pen1(PS_SOLID, 2, RGB(128,128,128));
CPen pen2(PS_SOLID, 2, RGB(128,128,0));
CPen* pOld = pDC->SelectObject(&pen1);
// ... 使用 pen1 繪圖
pDC->SelectObject(&pen2);
// ... 使用 pen2 繪圖
pen1.DeleteObject(); // 重用前刪除
pen1.CreatePen(PS_SOLID, 2, RGB(0,0,0));
pDC->SelectObject(&pen1);
// ... 繪圖
pDC->SelectObject(pOld); // 統一恢復
}
pDC->SelectStockObject(BLACK_BRUSH) 等預定義對象:
BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、LTGRAY_BRUSH、WHITE_BRUSH、NULL_BRUSH(透明)、HOLLOW_BRUSHBLACK_PEN、WHITE_PEN、NULL_PENANSI_VAR_FONT、ANSI_FIXED_FONT、DEVICE_DEFAULT_FONT、SYSTEM_FONT、SYSTEM_FIXED_FONT、DEFAULT_GUI_FONTCRgn::CreatePolygonRgn(points, n, ALTERNATE/WINDING) 創建多邊形區域。pDC->SelectClipRgn(&rgn) 設置剪裁區域,後續繪圖限制在區域內。CombineRgn(&rgnDest, &rgn1, &rgn2, RGN_AND/OR/XOR/DIFF/COPY) 區域布爾運算。SetWindowRgn(hRgn, TRUE)。GUI 對象是 GDI 資源的封裝,「創建→選入→繪圖→恢復→刪除」 是不變的鐵律。庫存對象適合簡單場景,複雜繪圖需自建對象並嚴格管理生命週期。區域對象賦予了非矩形剪裁與窗口造型能力。本文整理自 51CTO 博客「和GUI有關的各種對象」。