如何将 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 的前台?