是否必須搭配 CClientDC 才能使用 CBrush、CPen?CDC 無法使用?
CBrush、CPen 是 GDI 物件(刷子、筆刷)的 C++ 封裝,CDC、CClientDC、CPaintDC、CWindowDC 皆繼承自 CDC,代表裝置內容。**任何 CDC 衍生類別皆可選入刷子、筆刷進行繪圖**,兩者無綁定關係。
CBrush、CPen、CFont、CBitmap... 封裝 HGDIOBJ。CDC 封裝 HDC,提供繪圖函式(Rectangle、TextOut 等)。CDC::SelectObject(CGdiObject*) 將 GDI 物件選入 DC,繪圖時生效。| 類別 | 適用時機 | 生命週期 |
|---|---|---|
CClientDC | 非 WM_PAINT 時需即時繪製 | 函式區域,離開即釋放 |
CPaintDC | OnPaint 內部 | 自動呼叫 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 類別完全解耦,自由組合使用即可。