MFC SDI应用中是否存在SuspendLayout、ResumeLayout等效函数及重绘问题
MFC调整主窗口大小时暂停重绘的实现方案
问题说明
MFC的CFrameWnd/CWnd类没有.NET WinForm中SuspendLayout/ResumeLayout这类接口,你使用SetRedraw控制重绘的思路是正确的,出现自定义工具栏不自动重绘的原因是Invalidate()默认只会刷新主窗口自身的客户区,不会主动触发子控件的重绘逻辑。
修正后的代码
void CMainFrame::OnEnterSizeMove() { SetRedraw(FALSE); CFrameWnd::OnEnterSizeMove(); } void CMainFrame::OnExitSizeMove() { SetRedraw(TRUE); // 全量刷新主窗口+所有子窗口 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN | RDW_ERASE); CFrameWnd::OnExitSizeMove(); }
参数说明
RDW_INVALIDATE:标记窗口区域为无效状态,触发重绘流程RDW_UPDATENOW:立刻执行重绘操作,无需等待消息队列调度RDW_ALLCHILDREN:将重绘范围覆盖到所有子窗口,解决自定义工具栏不刷新的问题RDW_ERASE:重绘前先擦除背景,避免出现界面残影
备选方案
如果以上代码仍然无法刷新你的自定义工具栏,可主动调用工具栏对象的刷新方法,假设你的自定义工具栏成员变量名为m_wndCustomToolBar,新增一行代码即可:
void CMainFrame::OnExitSizeMove() { SetRedraw(TRUE); RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN | RDW_ERASE); m_wndCustomToolBar.Invalidate(); // 单独触发自定义工具栏重绘 CFrameWnd::OnExitSizeMove(); }
内容的提问来源于stack exchange,提问作者WillDotson
相关产品推荐
相关产品推荐

