GDI (Graphics Device Interface) 是 Windows 繪圖核心,所有繪圖函數皆需 HDC (Device Context Handle)。本文從基礎概念切入,實作平面風格狀態列繪製範例。
| 函數 | 適用場景 | 釋放方式 |
|---|---|---|
BeginPaint | WM_PAINT 回應中 | EndPaint |
GetWindowDC | 整個視窗(含邊框、標題列) | ReleaseDC |
GetDC | 僅用戶區 | ReleaseDC |
CDC:封裝 HDC,將 Rectangle(hdc,...) 簡化為 dc.Rectangle(...);CPaintDC:建構時 BeginPaint,解構時 EndPaint;CWindowDC / CClientDC:分別對應 GetWindowDC / GetDC。RECT 結構:left, top, right, bottom;CRect 衍生自 RECT,提供位移、縮放等便利方法。繼承 CStatusBar → CStatusBarNew,覆寫 WM_ERASEBKGND 與 WM_PAINT。
BOOL CStatusBarNew::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect);
CBrush brush(0xF2F2F2); // 淺灰 #F2F2F2
pDC->FillRect(&rect, &brush);
return TRUE; // 已處理,阻止預設擦除
}
void CStatusBarNew::OnPaint()
{
CPaintDC dc(this);
dc.SetBkMode(TRANSPARENT);
dc.SelectObject(::GetStockObject(NULL_BRUSH)); // 空畫刷,僅畫框
CRect rcItem;
// 取得各窗格矩形並繪製 3D 邊框/分隔線
// 範例略,核心 API:dc.Draw3dRect, dc.MoveTo, dc.LineTo
}
BitBlt、StretchBlt 位圖操作;CreateCompatibleDC 雙緩衝繪圖防閃爍;Graphics 類) 實現抗鋸齒、Alpha 混合等進階效果。