Layout CWinAppEx CleanState-重置布局

Layout CWinAppEx CleanState-重置布局,layout,mfc,registry,toolbar,Layout,Mfc,Registry,Toolbar,我迁移了我的MFC MDI应用程序以使用新的MFC功能包。我有很多工具栏和可固定的窗格。据我所知,它们的位置和大小在关闭应用程序时保存在注册表中,在加载主框架时加载 我想在应用程序中添加一项功能,将工具栏/窗格的布局重置为原始布局 我添加了一个菜单项,其命令在我的CWinAppEx派生类中处理,如下所示: CleanState(); LoadState((CMDIFrameWndEx*)m_pMainWnd); 但它似乎不能正常工作 但是,如果我将CleanState()函数调用放在调用Loa

我迁移了我的MFC MDI应用程序以使用新的MFC功能包。我有很多工具栏和可固定的窗格。据我所知,它们的位置和大小在关闭应用程序时保存在注册表中,在加载主框架时加载

我想在应用程序中添加一项功能,将工具栏/窗格的布局重置为原始布局

我添加了一个菜单项,其命令在我的
CWinAppEx
派生类中处理,如下所示:

CleanState();
LoadState((CMDIFrameWndEx*)m_pMainWnd);
但它似乎不能正常工作

但是,如果我将
CleanState()
函数调用放在调用
LoadMainFrame()
之前,则应用程序将以默认布局(我想要的布局)加载

有没有办法在我的应用程序加载后重新设置它的布局


非常感谢。

我没有一个简单的答案给你。我在Visual Studio 2017中有3个使用MFC功能包的对接窗口。我打电话给CleanSlate,然后定位对接窗格,确保它们可见。我尝试了主框架窗口和停靠窗口的大小,以使其看起来正确

void CMainFrame::OnButtonWindowResetLayout()
{
    theApp.CleanSlate();

    CRect rcInputsOutputs(0, 0, 400, 50);
    m_wndPaneInputsOutputs.DockToFrameWindow(CBRS_ALIGN_RIGHT, rcInputsOutputs, DT_DOCK_LAST, NULL, -1, FALSE);
    m_wndPaneInputsOutputs.ShowPane(TRUE);

    CRect rcDeviceStatus(0, 0, 600, 180);
    m_wndPaneDeviceStatus.DockToFrameWindow(CBRS_ALIGN_BOTTOM, rcDeviceStatus, DT_DOCK_LAST, NULL, -1, TRUE);
    m_wndPaneDeviceStatus.ShowPane(TRUE);

    CRect rcOutput(0, 0, 600, 70);
    m_wndOutput.DockToFrameWindow(CBRS_ALIGN_BOTTOM, rcOutput, DT_DOCK_LAST, NULL, -1, TRUE);
    m_wndOutput.ShowPane(TRUE);

    AdjustDockingLayout();
    SetWindowPos(&CWnd::wndTop, 0, 0, 900, 680, SWP_NOMOVE | SWP_NOACTIVATE | SWP_SHOWWINDOW);
}
每个窗格类都具有以下功能:

void CPaneDialogEx::ShowPane(BOOL showPane)
{
    if (showPane != IsVisible()) {

       CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, GetTopLevelFrame());

       if (pMainFrame != NULL) {
           pMainFrame->SetFocus();
           pMainFrame->ShowPane(this, showPane, FALSE, FALSE);
           pMainFrame->RecalcLayout();
       }
    }
}

是的,只需删除分配了布局保存的注册表项