MFC 中 Picture Control (靜態控制項 CStatic) 顯示 BMP 圖片需設定 SS_BITMAP 樣式並呼叫 SetBitmap,本文提供初始化顯示與通用封裝函數兩種實作。
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);
}
IMAGE_BITMAP:載入位圖0, 0:寬高為 0 表示使用實際尺寸LR_LOADMAP3DCOLORS:將灰階映射為系統 3D 顏色 (按鈕面/陰影/高光),讓圖片適應視覺風格LR_CREATEDIBSECTION 建立 DIB 區段以便像素操作SS_TYPEMASK (0x0000000F) 涵蓋 SS_LEFT/SS_CENTER/SS_RIGHT/SS_ICON/SS_BITMAP/SS_ENHMETAFILE 等類型樣式,清除後重設確保類型唯一SS_BITMAP 實現圖片居中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 三步曲與資源管理,輕鬆實現圖片顯示。