C++ 无法正确调整CToolBar子类的大小

C++ 无法正确调整CToolBar子类的大小,c++,mfc,toolbar,C++,Mfc,Toolbar,我的目标是要有一个CToolBar衍生物,它有一个单一的控制(CMFCShellTreeCtrl) 比如: class CFileTreeBar : public CToolBar 每当它被要求计算它的大小时,我想回答它要么是一个固定的最小值,要么是它停靠的停靠条的客户区域的大小。换句话说,它应该占用停靠条的整个高度+固定宽度(停靠在左侧-与资源管理器在左侧布置其文件夹树完全相同) 因此,在CFileTreeBar::CalcFixedLayout中,它根据GetParent()->GetWi

我的目标是要有一个CToolBar衍生物,它有一个单一的控制(CMFCShellTreeCtrl)

比如:

class CFileTreeBar : public CToolBar
每当它被要求计算它的大小时,我想回答它要么是一个固定的最小值,要么是它停靠的停靠条的客户区域的大小。换句话说,它应该占用停靠条的整个高度+固定宽度(停靠在左侧-与资源管理器在左侧布置其文件夹树完全相同)

因此,在CFileTreeBar::CalcFixedLayout中,它根据GetParent()->GetWindowRect(rect)响应高度,宽度为250pix

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

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

当我在CFrameWnd上点击“最大化”按钮时,我正在挣扎。在这种情况下,由于我不太理解的原因,调用了CalcFixedLayout,但停靠条有其旧的大小(尚未根据最大化的情况将其更新为新的大小)。这导致我的代码响应说大小应该和以前一样-这导致MFC框架不会发出调整大小的命令(我们已经达到了我们声称需要的大小)

因此,片刻之后,停靠条被扩展以占用整个垂直空间,但我的控制条及其底层shell树没有调整大小,而是保留了陈旧的大小

从最大化到恢复时也会出现问题。此时,调用CalcFixedLayout表明我们应该与最大化窗口(其当前大小)一样高,现在框架开始调整大小代码,最终使我们比停靠条大(一旦将其调整为还原大小),我们消失在停靠条底部以下(由其最大垂直范围剪裁)

问题
  • 是否有一个很好的教程或白皮书展示了DockBar和控制条在MFC中如何交互的概述?即,对框架如何正确地连接在一起的完整描述?理解这些部分如何组合在一起以及如何协调工作将大大有助于避免黑客攻击我不想工作,可以说我可以写一些圆的东西来适应这个圆洞
  • 有没有一个类似的例子项目是大家都知道的?必须找出这些垃圾是非常耗时的-如果有一个例子可以做到这一点,那就太好了

  • 可固定和可调整大小的工具栏对代码来说相当复杂,codeproject中有一个非常好的工具栏。您可以研究源代码,看看作者是如何做到这一点的


    谢谢您的链接和回复。我会看一看。我现在正在重读MFC“工具栏”的“内部构件”一章。我可以找到一些方法来解决这个问题,但还是喜欢一些不太繁重的东西。:)