0

我的目标是拥有一个 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 中交互的概述?即这个框架应该如何正确挂在一起的完整描述?了解这些部分如何组合在一起并旨在连贯地工作将大大有助于避免破解它来工作,让我可以写一些圆形的东西来适应圆孔,可以这么说。
  2. 是否有任何人都知道的与此类似的示例项目?必须弄清楚这个垃圾是非常耗时的——如果有一个例子可以做到这一点,那就太好了......
4

1 回答 1

2

可停靠和可调整大小的工具栏的代码相当复杂,codeproject 中有一个非常好。你可以研究一下源代码,看看作者是怎么做的。

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

于 2013-01-18T22:36:26.147 回答