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

VC++ 入門技巧:在 SDI 視窗客戶區繪製 BMP 圖片

     編輯:VC++

前言

Visual Basic 只需 LoadPicture 即可顯示圖片,但 VC++ 需手動處理裝置內容 (DC)、位圖物件與繪圖協調。本文以最簡單的 SDI 專案為例,示範在 OnDraw 中載入資源位圖並繪製至客戶區的標準流程。

步驟 1:匯入位圖資源

  1. 專案資源檢視 → 右鍵 Import → 選擇 BMP 檔
  2. 預設資源 ID 為 IDB_BITMAP1(請勿嘗試在資源編輯器修改像素,超過 256 色會導致調色盤錯誤)

步驟 2:在 OnDraw 實作繪圖代碼

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 物件
建立相容 DCCDC::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 拼寫正確,專案已編譯資源檔。
  • 顏色怪異: 位圖色深超過 256 色時,資源編輯器會強制轉調色盤;請使用 24/32-bit BMP 並改用 CImage 或 OleLoadPicture 載入。
  • 閃爍: 在 OnEraseBkgnd 回傳 TRUE 禁止背景擦除,或啟用雙重緩衝 (SetDoubleBuffered)。
  • 記憶體洩漏: 必須 SelectObject(pOldBmp) 還原,否則位圖物件無法正確刪除。

結語

掌握「資源 → CBitmap → 記憶體 DC → BitBlt」四步驟,即可在任何 CDC* 繪圖面上顯示位圖。進階應用可搭配 StretchBlt 縮放、TransparentBlt 透明色、或 CImage 支援 PNG/JPG/GIF 等現代格式。

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