重置CDockablePane

时间:2018-04-19 06:42:00

标签: mfc mfc-feature-pack

我迁移了我的MFC MDI应用程序以使用新的MFC功能包。我有很多工具栏和可停靠的窗格。据我了解,关闭应用程序时,每个位置和大小都保存在注册表中,并在加载主框架时加载。

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

我的应用程序中也有tabbedpanes。

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

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

Visual Studio具有类似的功能,称为“重置窗口布局”。

我正在使用SetWindowPlacement()GetWindowPlacement()在互联网上获取样本以恢复大型机窗口。

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

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

3 个答案:

答案 0 :(得分:2)

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

 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();

}

答案 1 :(得分:0)

如上面的评论中所述,从正在运行的应用程序恢复初始布局的一个选项是使用CDockablePane提供的方法,特别是

  • AttachToTabWindow
  • DockToWindow
  • ShowPane

要求重新启动应用程序的第二个选项是在EnableLoadDockState(FALSE)派生类的构造函数中调用CFrameWndEx。这样可以防止加载存储的停靠状态,从而恢复初始布局。

答案 2 :(得分:0)

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