首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 對話方塊背景填充顏色正確做法

     編輯:程式設計綜合問答

問題現象

在 OnEraseBkgnd 中嘗試用傳入的 CDC* pDC 繪製背景色,但畫面未如預期顯示指定顏色;改用 CClientDC 則正常。程式碼片段:

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetWindowRect(&rect); // 錯誤:取得螢幕座標
    pDC->SelectObject(&brush);
    pDC->Rectangle(rect);
    return CDialogEx::OnEraseBkgnd(pDC);
}

核心錯誤分析

  1. 座標系錯誤:GetWindowRect 回傳螢幕絕對座標,但 pDC 的裝置座標系是客戶區左上角為 (0,0)。應改用 GetClientRect。
  2. 刷子選入未還原:SelectObject 回傳舊物件指標,繪製完畢需還原,否則資源洩漏。
  3. 呼叫基底類別順序:若基底類別也會清除背景,應在繪製後呼叫,或直接回傳 TRUE 表示已自行處理,不再呼叫基底。

正確實作範例

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetClientRect(&rect); // 取得客戶區矩形

    CBrush* pOldBrush = pDC->SelectObject(&m_brush); // m_brush 為成員變數 CBrush
    pDC->Rectangle(&rect);
    pDC->SelectObject(pOldBrush); // 還原舊刷子

    return TRUE; // 已自行處理背景清除,不需呼叫基底類別
}

關鍵點補充

  • m_brush 應在建構子或 OnInitDialog 中建立:m_brush.CreateSolidBrush(RGB(0, 128, 255));
  • 若需漸層或圖片背景,可在 OnPaint 中繪製,並回傳 TRUE 於 OnEraseBkgnd 避免閃爍。
  • CClientDC、CPaintDC、傳入的 CDC* 本質相同,差別在建立時機與壽命,核心繪圖功能一致。

掌握座標系轉換與 DC 物件管理,即能正確控制 MFC 對話方塊背景繪製。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved