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

Windows GUI 核心對象全景:字體、筆刷、畫筆、位圖、區域

     編輯:關於C語言

五大 GUI 對象職責

對象類核心屬性典型用途
CFont字體名、字號、粗體、斜體、下劃線、字符集TextOut、DrawText 文字繪製
CBrush顏色、填充樣式(實心/斜線/交叉/自定義位圖)FillRect、Ellipse 封閉圖形填充
CPen顏色、寬度、線型(實線/虛線/點線/點劃線)MoveTo/LineTo、Rectangle 邊框繪製
CBitmap像素數據、寬高、色深、設備相關/無關(DIB)BitBlt、StretchBlt 圖像繪製
CRgn矩形/橢圓/多邊形/組合區域剪裁限制、非矩形窗口、命中測試

安全使用協議(MFC 模式)

  1. 創建:obj.CreateXxx(...) 或構造函數初始化。
  2. 選入 DC:CGdiObject* pOld = pDC->SelectObject(&obj),必須保存舊對象指針。
  3. 繪圖:調用 DC 繪圖函數。
  4. 恢復 DC:pDC->SelectObject(pOld) —— 關鍵步驟,防止 GDI 泄漏/崩潰。
  5. 銷毀: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_BRUSH
  • 畫筆:BLACK_PEN、WHITE_PEN、NULL_PEN
  • 字體:ANSI_VAR_FONT、ANSI_FIXED_FONT、DEVICE_DEFAULT_FONT、SYSTEM_FONT、SYSTEM_FIXED_FONT、DEFAULT_GUI_FONT

多邊形與剪裁區域進階

  • CRgn::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有關的各種對象」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved