C++ C++;/CMDIChildWndEx中的MFC:CDockablePane
我想在MDI子窗口中创建两个CDockablePane对象。最初,它们应该固定在底部,但用户应该有可能使它们浮动。 我从MFC项目向导创建的代码开始。然后,我将代码从表示主框架的类移动到表示子框架的类(CChildFrame)。我的结局是:C++ C++;/CMDIChildWndEx中的MFC:CDockablePane,c++,mfc,C++,Mfc,我想在MDI子窗口中创建两个CDockablePane对象。最初,它们应该固定在底部,但用户应该有可能使它们浮动。 我从MFC项目向导创建的代码开始。然后,我将代码从表示主框架的类移动到表示子框架的类(CChildFrame)。我的结局是: int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1) { retu
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,并且仅显示可用于调整高度的滑块。然而,我需要能够真正看到面板也为第一个子帧
如果我要提供更多的样本代码,请让我知道。
如果我做了一些完全错误的事情(支持在子框架中使用窗格吗?),也请让我知道
我猜下面链接中描述的问题是相同的。但这个问题没有答案。
我无法完全解决这个问题,最终我在主框架中创建了可停靠窗格,并将其隐藏起来,直到打开子框架。 该问题的部分解决方案是为窗格设置最小大小。这导致了他们不再被隐藏的情况
我的结论是,可停靠窗格不应该为子框架创建(或由子框架控制)。遗憾的是,这将在2年后到来=) 但我只是在创建窗格后,使用从CPane继承的方法解决了这个问题
m_wndProperties.SetMinSize(CSize(200,200));
你读过这个吗?我发现它消除了许多关于CDockablePane的模糊之处,尽管这些年来我已经用试错法解决了大部分问题。是的,我读过。这里的所有示例都使用主框架来添加可停靠窗格。我不会说:如果您想将CDockablePane停靠到CChildFrame中,那么一切都有解决方案:请参见此处