主對話框點擊按鈕彈出次對話框,在 Picture Control 顯示資源檔或指定路徑的 BMP 圖片。
// 次對話框類別 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
}
}
Owner Draw。CBitmap m_bmpMem;、CDC m_dcMem;。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)。Notify 或 Type: Bitmap 導致 SetBitmap 無效。CString 即 wchar_t*,直接傳給 LoadImage)。