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

Windows GDI 繪圖入門教學(VC SDK / MFC 實作)

     編輯:VC 教學

GDI (Graphics Device Interface) 是 Windows 繪圖核心,所有繪圖函數皆需 HDC (Device Context Handle)。本文從基礎概念切入,實作平面風格狀態列繪製範例。

一、核心概念速覽

取得 HDC 的三種途徑

函數適用場景釋放方式
BeginPaintWM_PAINT 回應中EndPaint
GetWindowDC整個視窗(含邊框、標題列)ReleaseDC
GetDC僅用戶區ReleaseDC

MFC 封裝類別對照

  • CDC:封裝 HDC,將 Rectangle(hdc,...) 簡化為 dc.Rectangle(...);
  • CPaintDC:建構時 BeginPaint,解構時 EndPaint;
  • CWindowDC / CClientDC:分別對應 GetWindowDC / GetDC。

座標與矩形

  • 以上 DC 均使用**相對座標**,原點 (0,0) 位於各自可繪製區域左上角;
  • RECT 結構:left, top, right, bottom;CRect 衍生自 RECT,提供位移、縮放等便利方法。

二、實戰:繪製平面風格狀態列

繼承 CStatusBar → CStatusBarNew,覆寫 WM_ERASEBKGND 與 WM_PAINT。

1. 擦除背景 — 填充單色

BOOL CStatusBarNew::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetWindowRect(&rect);
    ScreenToClient(&rect);
    CBrush brush(0xF2F2F2);  // 淺灰 #F2F2F2
    pDC->FillRect(&rect, &brush);
    return TRUE;  // 已處理,阻止預設擦除
}

2. 繪製邊框與分隔線

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 雙緩衝繪圖防閃爍;
  • 嘗試 GDI+ (Graphics 類) 實現抗鋸齒、Alpha 混合等進階效果。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved