You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:24:05