Visual Basic 只需 LoadPicture 即可顯示圖片,但 VC++ 需手動處理裝置內容 (DC)、位圖物件與繪圖協調。本文以最簡單的 SDI 專案為例,示範在 OnDraw 中載入資源位圖並繪製至客戶區的標準流程。
IDB_BITMAP1(請勿嘗試在資源編輯器修改像素,超過 256 色會導致調色盤錯誤)void CMyView::OnDraw(CDC* pDC)
{
// 1. 取得客戶區矩形
CRect rect;
GetClientRect(&rect); // 僅需客戶區大小,非視窗外框
// 2. 載入位圖資源
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
// 3. 建立相容記憶體 DC
CDC memDC;
memDC.CreateCompatibleDC(pDC);
// 4. 選入位圖並保存舊物件
CBitmap* pOldBmp = memDC.SelectObject(&bmp);
// 5. 位圖資訊(可選:依原始比例縮放或平鋪)
BITMAP bmInfo;
bmp.GetObject(sizeof(BITMAP), &bmInfo);
// 範例:平鋪填滿客戶區
for (int y = 0; y < rect.Height(); y += bmInfo.bmHeight)
for (int x = 0; x < rect.Width(); x += bmInfo.bmWidth)
pDC->BitBlt(x, y, bmInfo.bmWidth, bmInfo.bmHeight, &memDC, 0, 0, SRCCOPY);
// 6. 還原記憶體 DC
memDC.SelectObject(pOldBmp);
// bmp、memDC 離開作用域自動釋放
}
| 步驟 | API/成員 | 用途 |
|---|---|---|
| 取得區域 | GetClientRect | 獲得繪圖邊界(不含標題列/邊框) |
| 載入資源 | CBitmap::LoadBitmap | 從 .res 載入位圖至 GDI 物件 |
| 建立相容 DC | CDC::CreateCompatibleDC | 建立與螢幕相容的離屏繪圖面 |
| 選入物件 | CDC::SelectObject | 將位圖關聯至記憶體 DC,傳回舊物件指標 |
| 像素傳輸 | CDC::BitBlt | 高速複製像素區塊 (SRCCOPY=直接複製) |
| 還原/清理 | SelectObject(pOld) | 釋放 GDI 物件鎖定,防止資源洩漏 |
// 計算置中座標
int x = (rect.Width() - bmInfo.bmWidth) / 2;
int y = (rect.Height() - bmInfo.bmHeight) / 2;
if (x < 0) x = 0;
if (y < 0) y = 0;
pDC->BitBlt(x, y, bmInfo.bmWidth, bmInfo.bmHeight, &memDC, 0, 0, SRCCOPY);
LoadBitmap 回傳 TRUE,資源 ID 拼寫正確,專案已編譯資源檔。CImage 或 OleLoadPicture 載入。OnEraseBkgnd 回傳 TRUE 禁止背景擦除,或啟用雙重緩衝 (SetDoubleBuffered)。SelectObject(pOldBmp) 還原,否則位圖物件無法正確刪除。掌握「資源 → CBitmap → 記憶體 DC → BitBlt」四步驟,即可在任何 CDC* 繪圖面上顯示位圖。進階應用可搭配 StretchBlt 縮放、TransparentBlt 透明色、或 CImage 支援 PNG/JPG/GIF 等現代格式。