核心代碼
BOOL CBmpBgDlg::OnEraseBkgnd(CDC* pDC) {
CRect rc; GetClientRect(&rc);
BITMAP bm; m_bmp.GetObject(sizeof(BITMAP), &bm); // m_bmp 為 CBitmap 成員
CDC memDC; memDC.CreateCompatibleDC(pDC);
CBitmap* pOld = memDC.SelectObject(&m_bmp);
// 平鋪繪製
for (int x = 0; x < rc.Width(); x += bm.bmWidth)
for (int y = 0; y < rc.Height(); y += bm.bmHeight)
pDC->BitBlt(x, y, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOld);
return TRUE; // 告訴系統背景已處理,阻止預設擦除
}
初始化
BOOL CBmpBgDlg::OnInitDialog() {
CDialog::OnInitDialog();
m_bmp.LoadBitmap(IDB_DIALOG_BG); // 24-bit BMP
return TRUE;
}
進階:拉伸填滿 (非平鋪)
pDC->StretchBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
注意事項
- 返回 `TRUE` 關鍵:防止系統預設 `FillSolidRect` 覆蓋導致閃爍。
- 若對話框有 `WS_CLIPCHILDREN`,子控制項區域不會觸發 `OnEraseBkgnd`,無需額外處理。
- 高 DPI 下建議使用 `StretchBlt` 配合 `SetStretchBltMode(HALFTONE)` 獲得較佳畫質。