【问题标题】:Reset Layout of CDockablePane重置 CDockablePane 的布局
【发布时间】:2018-09-29 13:26:33
【问题描述】:

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

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

我的应用程序中也有标签窗格。

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

有没有办法在我的应用程序加载后实际重置它的布局?

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

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

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

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

【问题讨论】:

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

标签: mfc mfc-feature-pack


【解决方案1】:

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

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

}

【讨论】:

    【解决方案2】:

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

    • AttachToTabWindow
    • DockToWindow
    • ShowPane

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-18
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多