MFC技术问询:如何修改背景色?OnEraseBkgnd生效后被重置为灰色
解决MFC窗口背景色被重置的问题
先修复你代码里的核心错误
你的OnEraseBkgnd函数最后恢复画笔时写错了——应该把之前保存的pPrevBrush选回DC,而不是用当前的backBrush。局部的backBrush在函数结束后会被销毁,错误的画笔恢复会导致GDI资源泄漏,还会干扰后续绘制逻辑,这很可能是背景被重置的原因之一。修正后的代码:
BOOL CMainFrame::OnEraseBkgnd(CDC* pDC) { CBrush backBrush(RGB(0, 0, 0)); CBrush* pPrevBrush = pDC->SelectObject(&backBrush); CRect rect; pDC->GetClipBox(&rect); pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); // 恢复最初的画笔,不是当前的backBrush pDC->SelectObject(pPrevBrush); return TRUE; }
额外处理:避免视图/控件覆盖背景
如果你的主框架包含CView派生类的视图,视图的绘制会直接覆盖主框架的背景,这时候你需要在视图类里重写OnEraseBkgnd,同样设置目标背景色,或者将视图的背景设为透明。
另外,也可以直接修改窗口类的背景刷,实现一劳永逸的效果:
在CMainFrame::PreCreateWindow函数中,替换默认的灰色背景刷:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // 用系统黑色画刷替换默认背景 cs.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 如果要自定义颜色,用下面的代码(记得后续释放资源) // cs.hbrBackground = CreateSolidBrush(RGB(0,0,0)); return TRUE; }
如果用CreateSolidBrush创建自定义画刷,需要在窗口销毁时释放资源:
先在MainFrame.h里添加成员变量HBRUSH m_hbrCustomBackground;,然后在析构函数中处理:
CMainFrame::~CMainFrame() { if (m_hbrCustomBackground) { DeleteObject(m_hbrCustomBackground); } }
内容的提问来源于stack exchange,提问作者Alper Ali
相关产品推荐
相关产品推荐

