首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC Picture Control 顯示 BMP 圖片:從資源檔或檔案路徑載入並繪製

     編輯:程式設計綜合問答

需求

主對話框點擊按鈕彈出次對話框,在 Picture Control 顯示資源檔或指定路徑的 BMP 圖片。

方法一:載入資源 BMP(IDB_BITMAP1)

// 次對話框類別 CShowPicDlg
void CShowPicDlg::OnInitDialog() {
    CDialogEx::OnInitDialog();
    // 關聯控制項變數 m_picCtrl (CStatic)
    HBITMAP hBmp = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
    if (hBmp) m_picCtrl.SetBitmap(hBmp);
}

方法二:載入外部檔案路徑

void CShowPicDlg::SetImagePath(const CString& strPath) {
    // 釋放舊圖片
    if (m_hCurrentBmp) { DeleteObject(m_hCurrentBmp); m_hCurrentBmp = NULL; }
    // LR_CREATEDIBSECTION 確保可被 StretchBlt 縮放
    m_hCurrentBmp = (HBITMAP)::LoadImage(NULL, strPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    if (m_hCurrentBmp) {
        m_picCtrl.SetBitmap(m_hCurrentBmp);
        // 若需自動縮放至控制項大小,需自繪 (Owner Draw) 或 StretchBlt 到相容 DC 再 SetBitmap
    }
}

進階:自動縮放適應 Picture Control

  1. Picture Control 屬性設為 Owner Draw。
  2. 對話框類別新增 CBitmap m_bmpMem;、CDC m_dcMem;。
  3. 在 OnPaint 或 DrawItem 中:
void CShowPicDlg::OnPaint() {
    CPaintDC dc(this);
    CRect rect;
    m_picCtrl.GetClientRect(&rect);
    m_picCtrl.ClientToScreen(&rect);
    ScreenToClient(&rect);

    if (m_hCurrentBmp) {
        CDC dcMem;
        dcMem.CreateCompatibleDC(&dc);
        CBitmap* pOld = dcMem.SelectObject(CBitmap::FromHandle(m_hCurrentBmp));
        BITMAP bm; ::GetObject(m_hCurrentBmp, sizeof(bm), &bm);
        dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
        dcMem.SelectObject(pOld);
    }
}

常見坑點

  • 忘記釋放 HBITMAP 導致 GDI 物件洩漏(用 DeleteObject)。
  • Picture Control 未勾選 Notify 或 Type: Bitmap 導致 SetBitmap 無效。
  • 外部路徑包含中文,專案編碼需一致(Unicode 建置下 CString 即 wchar_t*,直接傳給 LoadImage)。

參考教學

百度經驗:MFC Picture Control 顯示圖片完整步驟

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