如何将 CPaneDialog 停靠到 MainFrm 和..?

Posted

技术标签:

【中文标题】如何将 CPaneDialog 停靠到 MainFrm 和..?【英文标题】:How to dock CPaneDialog to MainFrm and..? 【发布时间】:2009-12-11 21:17:56 【问题描述】:

我对 CPaneDialog 有疑问。 我使用 SetPaneSize MFC 功能包示例项目进行了测试。奇怪的是 CPaneDialog 不能停靠到 MainFrm 而 CDockablePane 可以。 CPaneDialog 也是 CDockablePane 的子类,但它不能。 只有 DockToWindow( &other_CPaneDialog_instance... ) 是可能的。 如果我调用 DockToPane(),CPaneDialog 的内容不会正确绘制或刷新。

如何将 CPaneDialog 停靠到 MainFrm 窗口?

另一个问题是关于绘图的。如果在 SetPaneSize 示例中删除树控件的代码,则 view1 的内容(CDockablePane 的实例)不会正确重绘。 在做了一些实验之后,我决定应该在它的 OnSize 和 OnPaint 方法中做一些事情。 (OnSize 更为关键。)这是预期的行为吗?

【问题讨论】:

【参考方案1】:

在转换较旧的 MFC 应用程序时,我遇到了与功能包类似的问题。我没有时间正确解决它,但我使用了以下解决方法:

    获取对话框资源并将其放入 CDialogBar 类中。 现在从 CDockablePane 派生一个类 在窗格的 OnCreate 方法中,创建您的对话框。

还有 2 件事:

void CInputPane::OnSize(UINT nType, int cx, int cy)

    CDockablePane::OnSize(nType, cx, cy);
    m_pInputBar->SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE | SWP_NOZORDER);


BOOL CInputPane::OnBeforeFloat(CRect& /*rectFloat*/,AFX_DOCK_METHOD /*dockMethod*/)

    return FALSE;

这确保了对话框的正确大小并防止用户拖动栏。

HTH,它对我有用。

【讨论】:

谢谢。实际上我在其他地方看到了类似的解决方案,但是 CPaneDialog 不是为了这种目的吗?此外,与其他 CDockablePane 衍生产品不同,CPaneDialog 的行为很奇怪,因为它不能使用 DockPane() 停靠。【参考方案2】:

Converting HexEdit to MFC9 (see http://www.hexedit.com) 我遇到了这个问题。我在 VS2010 (MFC10) 中测试过,这个 bug 似乎已经修复了。

还请注意,这个问题不是主要问题,因为您可以在 CMainFrame::OnCreate 中使用 DockToWindow 来停靠到 CDockablePane(如果有的话)。用户可以浮动窗口或将其停靠在别处,当程序重新打开时,该位置将被记住并恢复。

我很确定有人对 MFC9 中的这个 bug 有新的了解 - 因此在 SetPaneSize 演示中明显的解决方法(调用 CDockablePane::DockToWindow 而不是 DockPane 用于所有其他可停靠窗口)。但至少它在MFC10中是固定的。

我发现的另一个错误是,如果 CPaneDialog 在关闭(隐藏)时处于浮动状态,那么当您重新启动应用程序时,窗格会重新打开,而不是恢复到正确(隐藏)状态。如果窗格在关闭时停靠,则不会发生这种情况。这也已在 MFC10 中得到修复。

【讨论】:

以上是关于如何将 CPaneDialog 停靠到 MainFrm 和..?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 ToolTip 出现在浮动 CPaneDialog 的前台?

如何以编程方式将新元素停靠到 DockPanel

如何将侦听器添加到 osx 上的 java 停靠图标

如何使用代码停靠在父容器中

Chrome >=24 - 如何将 devtools 停靠在右侧?

Chrome >=24 - 如何将 devtools 停靠在右侧?