MFC 對話框預設使用系統 3D 面板色。若需自訂背景色或貼上圖片,有四種常見做法,各有適用場景與優缺點。
BOOL CMyApp::InitInstance()
{
// 影響所有對話框
SetDialogBkColor(RGB(192,192,192), RGB(0,0,0)); // 背景灰、文字黑
return TRUE;
}
// 對話框類別標頭
protected:
CBrush m_brushBg;
// OnInitDialog
m_brushBg.CreateSolidBrush(RGB(221,221,221));
// 訊息對應
ON_WM_CTLCOLOR()
// 處理函式
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_DLG) {
pDC->SetBkMode(TRANSPARENT);
return m_brushBg;
}
return hbr;
}
CBrush 避免重建;無法直接繪製圖片。void CMyDlg::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.FillSolidRect(rect, RGB(0,255,0)); // 綠底
}
WM_ERASEBKGND 返回 TRUE 才完整。BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.LoadBitmap(IDB_MY_BACKGROUND); // 資源位圖
BITMAP bm;
bmp.GetBitmap(&bm);
CBitmap* pOld = memDC.SelectObject(&bmp);
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(),
&memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
memDC.SelectObject(pOld);
return TRUE; // 阻止系統預設擦除
}
WS_EX_TRANSPARENT 或自行繪製。| 需求 | 推薦方法 | 補充 |
|---|---|---|
| 全專案統一背景色 | SetDialogBkColor | 最簡單 |
| 單一對話框純色 | OnCtlColor + CBrush | 效能最好,無閃爍 |
| 單一對話框圖片背景 | OnEraseBkgnd + StretchBlt | 記得 return TRUE |
| 控制項透明疊加圖片 | OnEraseBkgnd + 子控制項 WS_EX_TRANSPARENT | 需子類別化處理 WM_CTLCOLOR |