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

VC++ 技術內幕筆記第 5 章:GDI、色彩與字體繪圖基礎

     編輯:VC 教學

GDI 核心觀念

  • 所有螢幕/列印繪圖必須透過 GDI 函數;
  • 裝置環境 (DC, Device Context):代表實體裝置的抽象,MFC 類 CDC 封裝所有繪圖函數;
  • 每個 CDC 物件對應一個 Win32 HDC (32-bit handle);
  • 基類 CDC 含全部繪圖函數,衍生類僅建構/解構不同 (CMetaFileDC 例外)。

常用 DC 衍生類

類別建構函數繪圖範圍原點 (0,0)自動清理
CClientDCCClientDC(CWnd* pWnd)客戶區客戶區左上角是 (堆疊物件)
CWindowDCCWindowDC(CWnd* pWnd)整個視窗 (含標題、邊框、捲軸)視窗左上角是
CDC (基類)CDC() + CreateCompatibleDC/Attach記憶體/列印/Metafile視建立方式否 (需手動 ReleaseDC/DeleteDC)

關鍵提醒

  • View 視窗無非客戶區,CWindowDC 效果等同 CClientDC;
  • View 覆蓋於 Frame 之上,Frame 的非客戶區被遮蔽;
  • GetDC()/ReleaseDC() 配對使用,**絕不可**在 OnDraw(CDC* pDC) 參數上呼叫 delete 或 ReleaseDC,框架自動管理;
  • 記憶體 DC 建立流程:
    CDC memDC; memDC.CreateCompatibleDC(pDC);
    CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, w, h);
    CBitmap* pOld = memDC.SelectObject(&bmp);
    ... 繪圖到 memDC ...
    pDC->BitBlt(0,0,w,h, &memDC, 0,0, SRCCOPY);
    memDC.SelectObject(pOld); (歸還位圖再銷毀)

DC 狀態屬性 (影響繪圖輸出)

  • 畫筆 (CPen):顏色、寬度、樣式 (實線/虛線);
  • 畫刷 (CBrush):填充顏色/圖案;
  • 字型 (CFont):字型名、大小、粗細、斜體;
  • 文字/背景色:SetTextColor/SetBkColor/SetBkMode(TRANSPARENT/OPAQUE);
  • 映射模式:SetMapMode (MM_TEXT/MM_HIMETRIC 等);
  • 裁剪區域:SelectClipRgn 限制繪圖範圍。

GDI 物件管理鐵律

  1. 選入前建立,選出後刪除 (或析構函數自動刪除堆疊物件);
  2. SelectObject 返回舊物件指標,**必須保存並在結束時選回**,否則 GDI 物件洩漏;
  3. 預設物件 (GetStockObject) **不可刪除**;
  4. 大量/頻繁繪圖建議預建立 GDI 物件為成員變數,避免重複建構/解構開銷。

色彩模型

  • RGB 24-bit:RGB(r,g,b) 宏,各分量 0~255;
  • 調色盤 (8-bit/16-bit 裝置):CPalette 管理,現代全彩環境較少用;
  • 系統色:GetSysColor(COLOR_WINDOW) 等,追隨主題變化。

字體建立與選擇

CFont font;
font.CreateFont(
    -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0,
    DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
    DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("微軟正黑體")
);
CFont* pOld = pDC->SelectObject(&font);
pDC->TextOut(x, y, _T("Hello GDI"));
pDC->SelectObject(pOld); // 歸還
// font 析構自動 DeleteObject

高度負值 = 字元高度 (含內部間距);正值 = 字元盒高度。建議用負值配合邏輯座標系統。

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