获取 MFC CDockablePane 停靠的停靠区域

Posted

技术标签:

【中文标题】获取 MFC CDockablePane 停靠的停靠区域【英文标题】:Getting dock area where an MFC CDockablePane was docked 【发布时间】:2013-05-14 07:29:14 【问题描述】:

我正在做一个完全不想使用MFC 的内置window/dock 状态和位置保存的项目。这意味着在我的主框架中,我设置了EnableLoadDockState(FALSE)。尽管我很喜欢将其改回 TRUE,但我不能。

我计划通过我的CDockablePaneonAfterDock() 获得CDockablePane 停靠的位置。我的问题是我不知道如何知道它是放在侧面、顶部还是底部,在另一个 CDockablePane 上。

有没有办法获取这些信息?

谢谢!

【问题讨论】:

【参考方案1】:

我认为有办法获得它,但它不会很容易或漂亮。

如果您正在捕获OnAfterDock,我猜您对浮动窗格不感兴趣。因此,对于停靠的窗格,您可以使用 CDockablePane::GetDefaultPaneDivider (MSDN here),它会返回 - 正如 MSDN 所说:

如果可停靠窗格停靠到主框架窗口,则为有效的CPaneDivider 对象;如果可停靠窗格未停靠或处于浮动状态,则为 NULL。

CPaneDivider 对象 (MSDN here)

...划分两个窗格,划分两组窗格,或将一组窗格与主框架窗口的客户区分开

以下部分截图说明了更多内容:

因此,对于常规窗格分隔器,您可以使用CPaneDivider 上可用的方法来查找另一个窗格或另一个嵌入的CPaneDivider(因此此处需要递归查询)并检查分隔器是水平的还是垂直的等.

对于上述其他情况,请查看 CPaneContainerManager 类,它(同样是 as MSDN says)

...管理当前停靠布局的存储和显示

从这里,您可以再次向下钻取从原始停靠窗格开始的整个停靠层次结构。

如果我是你,我真的会再次考虑使用 EnableLoadDockState 或至少浏览 MFC 源代码,看看是否有任何内部帮助程序类/函数可以重用。

【讨论】:

谢谢!我会仔细看看的。我真的很讨厌 EnableLoadDockState 设置为 false,当停靠超过 2 个时,我什至无法正确取消选项卡式停靠。一旦我取得任何实际进展,我将更新此内容。 在尝试让它工作后,我或多或少地放弃了。我可以通过修改派生的 cDockablePane 类的保存状态来获取停靠大小和窗口大小和位置,但是停靠位置太难和太复杂而无法保存,因为这些存储在 CDockingManager 中并且需要的属性受到保护。【参考方案2】:

我刚刚解决了这个问题。我可以查看CDockablePanedwStyle (GetPaneStyle()) 中的CBRS_ALIGN_LEFTCBRS_ALIGN_RIGHT 等。没有复杂的方法。很简单。

【讨论】:

那么样式在停靠时会动态变化吗?此外,这无助于找到它停靠的对象,AIUI 是 OP 问题的一部分。 @RogerRowland 是的,样式会动态变化。你是对的。最后,我切换到EnableLoadDockState(TRUE)。我在对接管理器对象中找到了protected 代码,并做了一个hack 来调用它。但几分钟后我放弃了。对不起。也许您可以将该代码复制到您自己的对接管理器黑客课程中。

以上是关于获取 MFC CDockablePane 停靠的停靠区域的主要内容,如果未能解决你的问题,请参考以下文章

当 MFC(功能包)调用 CDockablePane::Serialize() 时?

MFC CView 进入 CDockablePane

将标尺添加到 MFC 应用程序中的 CDockablePane

使用 MFC Feature Pack 1 在 VS2008 中停靠选项卡式窗格位置

MFC CDockablePane启动后关闭CDockablePane,如何再次跳出CDockablePane

MFC:是不是有事件检测 CDockablePane 派生窗口何时通过滑出或显示打开?