无法正确保持我的CToolBar子类大小

时间:2013-01-16 18:00:05

标签: c++ mfc toolbar

我的目标是拥有一个CToolBar衍生物,它有一个控件(CMFCShellTreeCtrl)。

类似的东西:

class CFileTreeBar : public CToolBar

每当要求它计算它的大小时,我想回答它是固定的最小值,或者它停靠的停靠栏的客户区域的大小。换句话说,它应该消耗停靠栏的整个高度+一个固定的宽度(这是停靠在左侧 - 正如资源管理器在左侧列出它的文件夹树)。

因此,在CFileTreeBar :: CalcFixedLayout中,它基于GetParent() - > GetWindowRect(rect)以及250pix的宽度响应高度。

然后在OnSize中,CFileTreeBar调整其CMFCShellTreeCtrl的大小以使用我们的客户端rect(最大化我们唯一的控件)。

这在最初显示控制条时非常有效。通过拖动角落调整窗口大小时,它非常有用。 CaclFixedLayout返回与其先前值不同的值(因为窗口大小已更改),因此它计算它应该占用整个垂直空间并最终得到一条WM_SIZE消息告诉我的控制栏调整大小,这会导致我更新大小CMFCShellTreeCtrl。

我在奋斗的地方是在CFrameWnd上点击“最大化”按钮。在这种情况下,由于我不太了解的原因,CalcFixedLayout被调用但是停靠栏的旧尺寸(它尚未根据最大化而更新为新尺寸)。这导致我的代码响应大小应该与之前相同 - 这导致MFC框架工作不发出调整大小(我们已经知道我们需要的大小)。

因此,片刻之后,停靠栏被展开以消耗整个垂直空间,但是我的控制栏及其底层壳树没有调整大小 - 但留下了陈旧的大小。

从最大化到恢复时,问题也会发生。此时对CalcFixedLayout的调用表明我们应该与最大化窗口(当前大小)一样高,现在框架工作开始调整大小代码,最终使我们比停靠栏更大(一旦调整大小恢复大小),我们消失在停靠栏的底部(由它的最大垂直范围剪裁)。

问题

  1. 是否有一个很好的教程或白皮书,展示了如何在MFC中使用dockbars和控制栏进行交互的概述?即完整描述这个框架如何正常工作?理解这些部分如何组合在一起并且旨在协调一致地工作将大大有助于避免黑客入侵它,允许我写一些圆形的东西以适应圆孔,可以这么说。
  2. 是否有类似于此的示例项目,任何人都知道?不得不把这个垃圾弄清楚是非常耗时的 - 如果有一个例子可以做到这一点,那就太棒了......

1 个答案:

答案 0 :(得分:2)

Dockable和可调整大小的工具栏代码非常复杂,codeproject中有一个非常好。您可以研究源代码以了解作者是如何做到的。

http://www.codeproject.com/Articles/6/CSizingControlBar-a-resizable-control-bar