Mfc 重置CDockablePane的布局

Mfc 重置CDockablePane的布局,mfc,mfc-feature-pack,Mfc,Mfc Feature Pack,我迁移了我的MFC MDI应用程序以使用新的MFC功能包。我有很多工具栏和可固定的窗格。据我所知,它们的位置和大小在关闭应用程序时保存在注册表中,在加载主框架时加载 我想在应用程序中添加一项功能,将工具栏/窗格的布局重置为原始布局 我的应用程序中也有选项卡窗格 有时我会将单独的窗格停靠到选项卡式窗格 有没有办法在我的应用程序加载后重新设置它的布局 VisualStudio有一个类似的功能,称为“重置窗口布局” 我正在互联网上获取使用SetWindowPlacement()和GetWindowPl

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

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

我的应用程序中也有选项卡窗格

有时我会将单独的窗格停靠到选项卡式窗格

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

VisualStudio有一个类似的功能,称为“重置窗口布局”

我正在互联网上获取使用
SetWindowPlacement()
GetWindowPlacement()
恢复大型机窗口的示例

我不知道如何将这些功能用于工具栏和
CDockablePanes
并达到我的要求


除了使用
SetWindowPlacement()
GetWindowPlacement()
之外,还有其他解决方案吗?

如我在上面的评论中所述,从运行的应用程序恢复初始布局的一个选项是使用

  • AttachToTabWindow
  • DockToWindow
  • ShowPane

第二个选项需要重新启动应用程序,即调用派生类的构造函数。这将阻止加载存储的停靠状态,并因此恢复初始布局。

解决此问题的简单方法是从注册表项中删除存储面板信息的所有键:“BasePane”和“Workspace”中的“Pane”应用程序注册表项中的注册表文件夹:)简单。

我可以使用以下代码满足我的要求

 void CMainFrame::OnPanesResetLayout() 
    {
        CDockingManager* pDockMgr = GetDockingManager();
        if (pDockMgr == NULL)return;
        CRect rect;
        rect.SetRectEmpty();
        ClientToScreen(rect);
        SetRedraw(FALSE);

        CObList list;
        pDockMgr->GetPaneList(list, TRUE,0,TRUE);
        // UnDock and hide DockingControlBars
        POSITION pos;
        for (pos = list.GetHeadPosition(); pos != NULL;)
        {
            CBasePane* pBarNext = (CBasePane*) list.GetNext(pos);
            if (!::IsWindow(pBarNext->m_hWnd))continue;
            CDockablePane* pBar = DYNAMIC_DOWNCAST(CDockablePane, pBarNext);
            if (pBar != NULL)
            {
                if(pBar->IsAutoHideMode()) pBar->SetAutoHideMode(FALSE, CBRS_ALIGN_ANY);/*ToggleAutoHide();*/
                if (pBar->IsMDITabbed ())
                    continue;
                pBar->UndockPane();
                ShowPane(pBar, FALSE,FALSE, FALSE);
            }
            CMFCToolbar* pToolBar = DYNAMIC_DOWNCAST(CMFCToolbar, pBarNext);
            if(pToolBar)
                pToolBar->m_recentDockInfo.m_recentSliderInfo.m_rectDockedRect = rect;


        }

        m_wndBar1.DockToFrameWindow(CBRS_LEFT,m_wndBar1.GetAHRestoredRect());
        ShowPane(m_wndBar1, TRUE,FALSE, FALSE);
        m_wndBar2.DockToFrameWindow(CBRS_RIGHT,m_wndBar2.GetAHRestoredRect());
        ShowPane(m_wndBar2, TRUE,FALSE, FALSE);

    //for tabbed pane
    CTabbedPane *pTabbedPane;
    m_wndTab1.DockToFrameWindow(CBRS_BOTTOM,m_wndTab1.GetAHRestoredRect());
        m_wndTab2.AttachToTabWnd(&m_wndTab1, DM_SHOW, FALSE,reinterpret_cast<CDockablePane**>(&pTabbedPane));
        m_wndTab3.AttachToTabWnd(&m_wndTab1, DM_SHOW, FALSE,reinterpret_cast<CDockablePane**>(&pTabbedPane));

    ShowPane(m_wndTab1, TRUE,FALSE, FALSE);
    ShowPane(m_wndTab2, TRUE,FALSE, FALSE);
    ShowPane(m_wndTab3, TRUE,FALSE, FALSE);

    SetRedraw(TRUE);
        RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
        AdjustClientArea();

}
void CMainFrame::OnPanesResetLayout()
{
CDockingManager*pDockMgr=GetDockingManager();
if(pDockMgr==NULL)返回;
正确无误;
SetRectEmpty();
ClientToScreen(rect);
设置重绘(假);
合作伙伴名单;
pDockMgr->GetPaneList(list,TRUE,0,TRUE);
//松开并隐藏停靠控制栏
位置pos;
对于(pos=list.GetHeadPosition();pos!=NULL;)
{
CBasePane*pBarNext=(CBasePane*)list.GetNext(pos);
如果(!::IsWindow(pBarNext->m_hWnd))继续;
CDockablePane*pBar=DYNAMIC_DOWNCAST(CDockablePane,pBarNext);
如果(pBar!=NULL)
{
如果(pBar->IsAutoHideMode())pBar->SetAutoHideMode(FALSE,CBRS_ALIGN_ANY);/*ToggleAutoHide()*/
if(pBar->ismditabed())
继续;
pBar->UndockPane();
显示窗格(pBar、FALSE、FALSE、FALSE);
}
CMFCToolbar*pToolBar=DYNAMIC_DOWNCAST(CMFCToolbar,pBarNext);
if(pToolBar)
pToolBar->m_recentDockInfo.m_recentSliderInfo.m_rectdockdrect=rect;
}
m_wndBar1.docktoframeewindow(CBRS_左,m_wndBar1.GetAHRestoredRect());
显示窗格(m_wndBar1,TRUE,FALSE,FALSE);
m_wndBar2.docktoframeewindow(CBRS_RIGHT,m_wndBar2.GetAHRestoredRect());
显示窗格(m_wndBar2,TRUE,FALSE,FALSE);
//用于选项卡式窗格
十六烷基四烷*PTABDEPANE;
m_wndTab1.docktoframeewindow(CBRS_BOTTOM,m_wndTab1.GetAHRestoredRect());
m_wndTab2.附件(m_wndTab1,DM_SHOW,FALSE,reinterpret_cast(&ptabedpane));
m_wndTab3.附件ToTabWnd(&m_wndTab1,DM_SHOW,FALSE,reinterpret_cast(&ptabedpane));
显示窗格(m_wndTab1,真,假,假);
显示窗格(m_wndTab2,真、假、假);
显示窗格(m_wndTab3,真、假、假);
SetRedraw(真);
重画窗口(NULL,NULL,RDW_无效| RDW_更新| RDW_擦除| RDW_所有子项);
调整客户区域();
}

查看
CFullScreenImpl::ShowFullScreen
的代码可能是一个好的开始。您可以使用
CDockablePane
方法恢复初始布局,例如
AttachToTabWindow
DockToWindow
ShowPane
。。。或者在
CMainFrameEx
的构造函数中调用
EnableLoadDockState(FALSE)
(后者需要重新启动应用程序)来阻止加载存储的布局。sergiol和fhe,感谢您的建议。它帮助了我,并且能够达到我的要求。