C ++ / MFC:CMDIChildWndEx中的CDockablePane

时间:2015-11-16 13:20:24

标签: c++ mfc

我想在MDI子窗口中创建两个CDockablePane对象。最初,它们应该停靠在底部,但用户应该有可能浮动它们。 我开始使用MFC项目向导创建的代码。然后我将代码从表示主框架的类移动到表示子框架的类(CChildFrame)。我最终得到了这个:

int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1) {
        return -1;
    }

    EnableDocking(CBRS_ALIGN_ANY);
    EnableAutoHidePanes(CBRS_ALIGN_ANY);

    // Create left window and dock to ChildFrame
    m_wndOutput.Create(_T("Left pane"), this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_OUTPUTWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI);
    m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_wndOutput);

    // Create right window and dock to the left pane
    m_wndProperties.Create(_T("Right pane"), this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI);
    m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
    m_wndProperties.DockToWindow (&m_wndOutput, CBRS_ALIGN_RIGHT);

    return 0;
}

首先,窗格无法浮动。我可以通过在我的CChildFrame构造函数中添加以下语句来解决这个问题:

CMDIChildWndEx :: m_bEnableFloatingBars = TRUE;

这解决了不浮动的问题,但我怀疑这是问题的规范解决方案。任何人都可以判断吗?你是如何解决这个问题的?

我无法解决的问题是窗格最初的高度= 0。 有趣的是,如果我打开同一类的第二个或第三个子框架,它可以工作,并且它们最初是可见的(高度= 200)。如果我将它们全部关闭并打开一个新的,高度再次为0,只有滑块出现,我可以用来调整高度。但是,我需要能够真正看到第一个子框架的面板。

如果我要提供更多示例代码,请告诉我。 如果我做了一些完全错误的事情(是否支持在子框架中放置窗格?),请告诉我。

我猜以下链接中描述的问题是相同的。但是这个问题没有答案。 https://social.msdn.microsoft.com/forums/en-US/7494e84f-e5fd-4726-b8fe-9c702c7e25f1/cmdichildwndex-and-cdockablepane-issue

2 个答案:

答案 0 :(得分:1)

遗憾的是,这将在2年后出现=)

但我刚刚使用方法SetMinSize解决了问题,该方法是在创建窗格后从CPane继承的。

m_wndProperties.SetMinSize(CSize(200,200));

答案 1 :(得分:0)

我无法完全解决问题,最终我最终在主框架中创建了可停靠的窗格并隐藏它们直到我的子框架被打开。 该问题的部分解决方案是为窗格设置最小尺寸。这导致他们不再被隐藏的情况。

我的结论是,可停靠窗格不是为子框架创建(或由其控制)。