有麻烦保持我的CToolBar子类大小正确

Having trouble keeping my CToolBar subclass sized correctly

本文关键字:子类 CToolBar 麻烦 我的      更新时间:2023-10-16

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

类似:

class CFileTreeBar : public CToolBar

每当它被要求计算它的大小时,我想要响应它要么是一个固定的最小值,要么是它所停靠的码头栏的客户端区域的大小。换句话说,它应该占用dock栏的整个高度+一个固定的宽度(这是停靠在左侧-就像Explorer在左侧布局其文件夹树一样)。

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

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

当控制栏最初显示时,这非常适合。当通过拖动一个角来调整窗口大小时,它的效果很好。CaclFixedLayout返回一个不同于它以前的值(因为窗口大小改变了),所以它计算它应该消耗整个垂直空间,最终我得到一个WM_SIZE消息告诉我的控制栏调整大小,这导致我更新CMFCShellTreeCtrl的大小。

我挣扎的地方是在cframewind上点击"最大化"按钮时。在这种情况下,出于我不太理解的原因,CalcFixedLayout被调用,但dock栏有它的旧大小(它还没有被更新到基于最大化的新大小)。这导致我的代码响应大小应该与之前相同-这导致MFC框架工作不发出调整大小(我们已经是我们声称需要的大小)。

因此,过了一会儿,dock栏被扩展到占用整个垂直空间,但是我的控制栏和它的底层shell树没有调整大小,而是保持旧的大小。

当从最大化到恢复时也会出现这个问题。此时调用CalcFixedLayout表明我们应该和最大化窗口一样高(它的当前大小),现在框架工作启动大小调整代码,最终使我们比dock栏更大(一旦它被调整到恢复大小),我们消失在dock栏的底部以下(被它的最大垂直范围剪切)。

  1. 是否有一个很好的教程或白皮书显示如何dock栏和控制栏应该在MFC交互的概述?也就是说,如何这个框架工作的完整描述应该挂在一起正确?理解这些部分是如何组合在一起的,并打算连贯地工作,将大大有助于避免破解它的工作,允许我写一些圆的东西来适应圆孔,可以这么说。
  2. 是否有一个类似的例子项目,任何人都知道?要弄清楚这些垃圾是非常耗时的——如果有一个例子可以做到这一点,那就太好了……

可停靠和可调整大小的工具栏是相当复杂的代码,有一个在codeproject相当不错。您可以研究源代码,看看作者是如何做到的。

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