執行期指定路徑載入 BMP,並自動調整 Picture Control 大小以完整顯示圖片,不變形、不裁切。
class CDisplayPic : public CDialog
{
CBitmap m_bmp; // 持有位圖物件
// ...
};
BOOL CDisplayPic::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_bmp.m_hObject) m_bmp.DeleteObject();
// LoadImage 取得 HBITMAP (支援檔案路徑)
HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
_T("c:\\aaa.bmp"), IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_LOADFROMFILE);
if (!hBmp) return FALSE;
m_bmp.Attach(hBmp);
// 取得圖片實際寬高
DIBSECTION ds;
m_bmp.GetObject(sizeof(ds), &ds);
int cx = ds.dsBmih.biWidth;
int cy = ds.dsBmih.biHeight;
// 調整 Picture Control (IDC_STATIC1) 大小
CRect rc;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rc);
ScreenToClient(&rc);
GetDlgItem(IDC_STATIC1)->MoveWindow(rc.left, rc.top, cx, cy, TRUE);
return TRUE;
}
void CDisplayPic::OnPaint()
{
// 取得 Picture Control 的 DC
CPaintDC dc(GetDlgItem(IDC_STATIC1));
CRect rcClient;
GetDlgItem(IDC_STATIC1)->GetClientRect(&rcClient);
// 雙緩衝:記憶體 DC 合成後一次 BitBlt
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap bmpMem;
bmpMem.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
CBitmap* pOldMem = memDC.SelectObject(&bmpMem);
// 先將對話框背景繪製到記憶體 DC (避免透明背景殘影)
CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
// 建立單色遮罩 (可選,用於透明色處理)
CDC maskDC;
maskDC.CreateCompatibleDC(&dc);
CBitmap bmpMask;
bmpMask.CreateBitmap(rcClient.Width(), rcClient.Height(), 1, 1, NULL);
CBitmap* pOldMask = maskDC.SelectObject(&bmpMask);
maskDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
// 使用圖片建立紋理筆刷填充
CBrush brush;
brush.CreatePatternBrush(&m_bmp);
dc.FillRect(rcClient, &brush);
// 合成顯示 (SRCPAINT 實現透明色效果)
dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(),
&memDC, 0, 0, SRCPAINT);
brush.DeleteObject();
maskDC.SelectObject(pOldMask);
memDC.SelectObject(pOldMem);
// 不呼叫 CDialog::OnPaint(),避免重複繪製
}
GetObject 取得 BITMAPINFOHEADER。FillRect 可自動平鋪填充任意矩形。SRCPAINT (OR 運算) 可實現簡易透明色效果 (黑色背景變透明)。CPaintDC(GetDlgItem(...)) 直接針對 Picture Control 客戶區繪製,不影響對話框其他區域。若需支援 JPEG/PNG/GIF,可改用 IPicture (OLE 圖片物件) 或 GDI+ (Image::FromFile) 載入,再 GetHBITMAP 轉為 HBITMAP 供 CBitmap::Attach 使用。