CDC 封裝所有繪圖函數;CDC 物件對應一個 Win32 HDC (32-bit handle);CDC 含全部繪圖函數,衍生類僅建構/解構不同 (CMetaFileDC 例外)。| 類別 | 建構函數 | 繪圖範圍 | 原點 (0,0) | 自動清理 |
|---|---|---|---|---|
CClientDC | CClientDC(CWnd* pWnd) | 客戶區 | 客戶區左上角 | 是 (堆疊物件) |
CWindowDC | CWindowDC(CWnd* pWnd) | 整個視窗 (含標題、邊框、捲軸) | 視窗左上角 | 是 |
CDC (基類) | CDC() + CreateCompatibleDC/Attach | 記憶體/列印/Metafile | 視建立方式 | 否 (需手動 ReleaseDC/DeleteDC) |
CWindowDC 效果等同 CClientDC;GetDC()/ReleaseDC() 配對使用,**絕不可**在 OnDraw(CDC* pDC) 參數上呼叫 delete 或 ReleaseDC,框架自動管理;CDC memDC; memDC.CreateCompatibleDC(pDC);CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, w, h);CBitmap* pOld = memDC.SelectObject(&bmp);pDC->BitBlt(0,0,w,h, &memDC, 0,0, SRCCOPY);memDC.SelectObject(pOld); (歸還位圖再銷毀)CPen):顏色、寬度、樣式 (實線/虛線);CBrush):填充顏色/圖案;CFont):字型名、大小、粗細、斜體;SetTextColor/SetBkColor/SetBkMode(TRANSPARENT/OPAQUE);SetMapMode (MM_TEXT/MM_HIMETRIC 等);SelectClipRgn 限制繪圖範圍。SelectObject 返回舊物件指標,**必須保存並在結束時選回**,否則 GDI 物件洩漏;GetStockObject) **不可刪除**;RGB(r,g,b) 宏,各分量 0~255;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
高度負值 = 字元高度 (含內部間距);正值 = 字元盒高度。建議用負值配合邏輯座標系統。