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

VC Picture Control 顯示 BMP 圖片完整實作與封裝函數

     編輯:關於VC++

MFC 中 Picture Control (靜態控制項 CStatic) 顯示 BMP 圖片需設定 SS_BITMAP 樣式並呼叫 SetBitmap,本文提供初始化顯示與通用封裝函數兩種實作。

對話方塊初始化顯示 BMP

BOOL CLoginDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    
    // 1. 載入位圖資源 (LR_LOADMAP3DCOLORS 映射系統 3D 顏色)
    HBITMAP hBitmap = (HBITMAP)LoadImage(
        AfxGetInstanceHandle(),
        MAKEINTRESOURCE(IDB_BITMAP_LOGIN_PIC),
        IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
    
    // 2. 取得 Picture Control 指標
    CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PIC);
    
    // 3. 修改樣式:移除原有 SS_* 樣式 (0xF 掩碼),設定 SS_BITMAP | SS_CENTERIMAGE
    pStatic->ModifyStyle(0x0F, SS_BITMAP | SS_CENTERIMAGE);
    
    // 4. 設定位圖
    pStatic->SetBitmap(hBitmap);
    
    return TRUE;
}

通用封裝函數

// uBmpResource: 位圖資源 ID (如 IDB_MY_PIC)
// uCtrlResource: Picture Control 控制項 ID (如 IDC_MY_PIC)
void SetBitmap(UINT uBmpResource, UINT uCtrlResource) {
    HBITMAP hBitmap = (HBITMAP)LoadImage(
        AfxGetInstanceHandle(),
        MAKEINTRESOURCE(uBmpResource),
        IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
    
    CStatic* pStatic = (CStatic*)GetDlgItem(uCtrlResource);
    pStatic->ModifyStyle(0x0F, SS_BITMAP);  // 僅設 SS_BITMAP,不含置中
    pStatic->SetBitmap(hBitmap);
}

關鍵技術點解析

  1. LoadImage 參數:
    • IMAGE_BITMAP:載入位圖
    • 0, 0:寬高為 0 表示使用實際尺寸
    • LR_LOADMAP3DCOLORS:將灰階映射為系統 3D 顏色 (按鈕面/陰影/高光),讓圖片適應視覺風格
    • 亦可用 LR_CREATEDIBSECTION 建立 DIB 區段以便像素操作
  2. ModifyStyle 掩碼 0x0F:SS_TYPEMASK (0x0000000F) 涵蓋 SS_LEFT/SS_CENTER/SS_RIGHT/SS_ICON/SS_BITMAP/SS_ENHMETAFILE 等類型樣式,清除後重設確保類型唯一
  3. SS_CENTERIMAGE:垂直置中顯示 (需 Windows 2000+),配合 SS_BITMAP 實現圖片居中
  4. HBITMAP 生命週期:SetBitmap 不取得擁有權,**銷毀對話方塊前必須手動 DeleteObject(hBitmap)**,否則 GDI 物件洩漏

進階:動態載入檔案圖片

void LoadBitmapFromFile(CStatic* pStatic, LPCTSTR szFilePath) {
    HBITMAP hBitmap = (HBITMAP)LoadImage(
        NULL, szFilePath, IMAGE_BITMAP, 0, 0, 
        LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
    if (hBitmap) {
        // 保存舊位圖以便釋放
        HBITMAP hOld = (HBITMAP)pStatic->SendMessage(STM_GETIMAGE, IMAGE_BITMAP);
        pStatic->ModifyStyle(0x0F, SS_BITMAP | SS_CENTERIMAGE);
        pStatic->SetBitmap(hBitmap);
        if (hOld) DeleteObject(hOld);
    }
}

常見問題排查

現象原因解決
圖片不顯示/空白資源 ID 錯誤/未包含在 .rc檢查 resource.h、.rc 檔案
圖片變形/截斷Picture Control 尺寸與圖片不符調整控制項大小或啟用 SS_CENTERIMAGE/SS_REALSIZEIMAGE
顏色異常調色盤/位元深度不匹配使用 LR_LOADMAP3DCOLORS 或確保 24/32 位真彩色
GDI 物件計數持續增長未釋放 HBITMAP對話方塊銷毀時 DeleteObject

掌握 LoadImage → ModifyStyle → SetBitmap 三步曲與資源管理,輕鬆實現圖片顯示。

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