我的目标是拥有一个CToolBar衍生物,它有一个控件(CMFCShellTreeCtrl)。
类似的东西:
class CFileTreeBar : public CToolBar
每当要求它计算它的大小时,我想回答它是固定的最小值,或者它停靠的停靠栏的客户区域的大小。换句话说,它应该消耗停靠栏的整个高度+一个固定的宽度(这是停靠在左侧 - 正如资源管理器在左侧列出它的文件夹树)。
因此,在CFileTreeBar :: CalcFixedLayout中,它基于GetParent() - > GetWindowRect(rect)以及250pix的宽度响应高度。
然后在OnSize中,CFileTreeBar调整其CMFCShellTreeCtrl的大小以使用我们的客户端rect(最大化我们唯一的控件)。
这在最初显示控制条时非常有效。通过拖动角落调整窗口大小时,它非常有用。 CaclFixedLayout返回与其先前值不同的值(因为窗口大小已更改),因此它计算它应该占用整个垂直空间并最终得到一条WM_SIZE消息告诉我的控制栏调整大小,这会导致我更新大小CMFCShellTreeCtrl。
我在奋斗的地方是在CFrameWnd上点击“最大化”按钮。在这种情况下,由于我不太了解的原因,CalcFixedLayout被调用但是停靠栏的旧尺寸(它尚未根据最大化而更新为新尺寸)。这导致我的代码响应大小应该与之前相同 - 这导致MFC框架工作不发出调整大小(我们已经知道我们需要的大小)。
因此,片刻之后,停靠栏被展开以消耗整个垂直空间,但是我的控制栏及其底层壳树没有调整大小 - 但留下了陈旧的大小。
从最大化到恢复时,问题也会发生。此时对CalcFixedLayout的调用表明我们应该与最大化窗口(当前大小)一样高,现在框架工作开始调整大小代码,最终使我们比停靠栏更大(一旦调整大小恢复大小),我们消失在停靠栏的底部(由它的最大垂直范围剪裁)。
答案 0 :(得分:2)
Dockable和可调整大小的工具栏代码非常复杂,codeproject中有一个非常好。您可以研究源代码以了解作者是如何做到的。
http://www.codeproject.com/Articles/6/CSizingControlBar-a-resizable-control-bar