首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 中 CBRUSH/CPEN 與 CDC 的關係釐清

     編輯:程式設計綜合問答

提問疑慮

是否必須搭配 CClientDC 才能使用 CBrush、CPen?CDC 無法使用?

結論:完全無關

CBrush、CPen 是 GDI 物件(刷子、筆刷)的 C++ 封裝,CDC、CClientDC、CPaintDC、CWindowDC 皆繼承自 CDC,代表裝置內容。**任何 CDC 衍生類別皆可選入刷子、筆刷進行繪圖**,兩者無綁定關係。

物件層級說明

  • GDI 物件:CBrush、CPen、CFont、CBitmap... 封裝 HGDIOBJ。
  • 裝置內容:CDC 封裝 HDC,提供繪圖函式(Rectangle、TextOut 等)。
  • 選入機制:CDC::SelectObject(CGdiObject*) 將 GDI 物件選入 DC,繪圖時生效。

常見 DC 類別用途

類別適用時機生命週期
CClientDC非 WM_PAINT 時需即時繪製函式區域,離開即釋放
CPaintDCOnPaint 內部自動呼叫 BeginPaint/EndPaint
CWindowDC需繪製非客戶區(標題列、邊框)函式區域
CDC* 參數OnEraseBkgnd、OnDraw 等訊息處理函式由框架建立/管理

程式碼示範

// 任意 DC 皆可使用同樣的刷子/筆刷
void CMyView::OnDraw(CDC* pDC)
{
    CBrush brush(RGB(255, 0, 0));
    CPen pen(PS_SOLID, 2, RGB(0, 0, 255));

    CBrush* pOldBrush = pDC->SelectObject(&brush);
    CPen* pOldPen = pDC->SelectObject(&pen);

    pDC->Rectangle(10, 10, 100, 100);

    pDC->SelectObject(pOldBrush);
    pDC->SelectObject(pOldPen);
}

總結:GDI 物件與 DC 類別完全解耦,自由組合使用即可。

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