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

MFC OnEraseBkgnd 繪製背景失效:應改用 OnPaint 重繪

     編輯:程式設計綜合問答

問題代碼

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC) {
    CBrush* old = pDC->SelectObject(&m_brush);
    pDC->Rectangle(m_rect);
    pDC->SelectObject(old);
    return CDialogEx::OnEraseBkgnd(pDC); // 錯誤:父類會再次擦除背景
}

失效原因

  • OnEraseBkgnd 僅負責「擦除背景」,回傳 TRUE 表示已處理,**但隨後系統仍會呼叫 OnPaint 繪製前景**;若 OnPaint 未處理背景,預設會再次填滿系統色,覆蓋你的矩形。
  • 範例中仍呼叫父類 OnEraseBkgnd,導致雙重擦除。

正確做法:在 OnPaint 統一繪製

void CMyDlg::OnPaint() {
    CPaintDC dc(this);
    CRect rect; GetClientRect(&rect);
    dc.FillRect(&rect, &m_brush); // 或 dc.Rectangle(rect);
    // 繪製其他控制項...
}
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC) {
    return TRUE; // 告訴系統背景已手動處理,勿再擦除
}

進階:雙緩衝防閃爍

void CMyDlg::OnPaint() {
    CPaintDC dc(this);
    CMemDC memDC(dc); // MFC 雙緩衝類
    CRect rect; GetClientRect(&rect);
    memDC.FillRect(&rect, &m_brush);
    // ... 其他繪製
}

總結

MFC 繪製背景請統一在 OnPaint,OnEraseBkgnd 僅回傳 TRUE 抑制預設擦除。若需複雜背景 (漸層、圖片),建議使用 CMemDC 雙緩衝。

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