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,導致雙重擦除。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 雙緩衝。