MFC 對話框(CDialog)與視圖(CView)預設使用系統 3D 面板色。本文比較四種變更背景色的方法,分析優缺點與適用場景。
BOOL CMyApp::InitInstance()
{
SetDialogBkColor(RGB(192,192,192), RGB(0,0,0)); // 背景、文字
return TRUE;
}
// 標頭
protected:
CBrush m_brushBg;
// OnInitDialog
m_brushBg.CreateSolidBrush(RGB(0,255,0)); // 綠色
// 訊息對應
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 避免重建/洩漏。WM_CTLCOLOR)。
void CMyView::OnPaint()
{
CPaintDC dc(this);
CRect rc; GetClientRect(&rc);
dc.FillSolidRect(rc, RGB(0,255,0));
}
WM_ERASEBKGND 返回 TRUE 才完整。
BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
CRect rc; GetClientRect(&rc);
CBrush brush(RGB(0,0,0)); // 黑色
CBrush* pOld = pDC->SelectObject(&brush);
pDC->Rectangle(&rc);
pDC->SelectObject(pOld);
return TRUE; // 阻止系統預設擦除
}
OnPaint 高。WS_EX_TRANSPARENT。| 方法 | 適用對象 | 支援圖片 | 子控制項影響 | 推薦場景 |
|---|---|---|---|---|
| SetDialogBkColor | Dialog/View | 否 | 無 | 全專案統一色系 |
| OnCtlColor | Dialog | 否 | 可分別控制 | 單一對話框純色 |
| OnPaint | Dialog/View | 是(可自行繪圖) | 會覆蓋 | 簡單測試/漸層/圖形 |
| OnEraseBkgnd | Dialog/View | 是 | 會覆蓋 | 圖片背景/雙緩衝 |
BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
CRect rc; GetClientRect(&rc);
CDC memDC; memDC.CreateCompatibleDC(pDC);
CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
CBitmap* pOld = memDC.SelectObject(&bmp);
// 載入資源位圖並拉伸繪製到 memDC
CBitmap bg; bg.LoadBitmap(IDB_BG);
CDC bgDC; bgDC.CreateCompatibleDC(&memDC);
CBitmap* pOldBg = bgDC.SelectObject(&bg);
BITMAP bm; bg.GetBitmap(&bm);
memDC.StretchBlt(0,0,rc.Width(),rc.Height(), &bgDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
bgDC.SelectObject(pOldBg);
pDC->BitBlt(0,0,rc.Width(),rc.Height(), &memDC,0,0,SRCCOPY);
memDC.SelectObject(pOld);
return TRUE;
}