首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 對話框背景顏色與圖片設定:四種方法完整比較

     編輯:VC 教學

前言

MFC 對話框預設使用系統 3D 面板色。若需自訂背景色或貼上圖片,有四種常見做法,各有適用場景與優缺點。

方法一:全域設定(CWinApp::SetDialogBkColor)

BOOL CMyApp::InitInstance()
{
    // 影響所有對話框
    SetDialogBkColor(RGB(192,192,192), RGB(0,0,0)); // 背景灰、文字黑
    return TRUE;
}
  • 優點:一行搞定所有對話框。
  • 缺點:無法針對單一對話框設定;無法設定圖片。

方法二:WM_CTLCOLOR 訊息(OnCtlColor)

// 對話框類別標頭
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 避免重建;無法直接繪製圖片。

方法三:WM_PAINT 訊息(OnPaint)繪製純色

void CMyDlg::OnPaint()
{
    CPaintDC dc(this);
    CRect rect;
    GetClientRect(&rect);
    dc.FillSolidRect(rect, RGB(0,255,0)); // 綠底
}
  • 缺點:會覆蓋所有子控制項背景,導致編輯框、按鈕出現白框;需額外處理 WM_ERASEBKGND 返回 TRUE 才完整。

方法四:WM_ERASEBKGND 繪製圖片(StretchBlt)

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 或自行繪製。

最佳實務建議

進階:雙緩衝背景避免閃爍

BOOL CMyDlg::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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
需求推薦方法補充
全專案統一背景色SetDialogBkColor最簡單
單一對話框純色OnCtlColor + CBrush效能最好,無閃爍
單一對話框圖片背景OnEraseBkgnd + StretchBlt記得 return TRUE
控制項透明疊加圖片OnEraseBkgnd + 子控制項 WS_EX_TRANSPARENT需子類別化處理 WM_CTLCOLOR