MFC中的Header Bar控件实现

在MFC应用程序开发中,经常需要实现一些自定义的控件来满足特定的用户界面需求。Header Bar控件就是其中一种常见的需求,它通常位于窗口的顶部,包含一些按钮或下拉按钮,用于提供导航或其他功能。本文将介绍如何在MFC中实现一个高质量的Header Bar控件,使其能够像标准的MFC控件库中的控件一样被开发者使用。

Header Bar控件的设计目标主要有三个:

  • MFC类库集成并使用。
  • 类不应该要求开发者使用任何钩子或回调,或者做任何特殊的事情来使用这个类。
  • 代码应尽可能轻量,并且能够在尽可能多的Windows CE变体上工作。

Header Bar控件应该能够在主窗口的左侧或右侧添加一个按钮或下拉按钮。这个按钮然后会向主框架窗口发送一个命令,该命令将被路由到当前视图或文档,就像MFC中的任何正常消息一样。

实现细节

在Inbox应用程序中,Header Bar控件是一个工具栏公共控件,因此可以选择是派生自CToolbarCtrl还是CWnd。最终决定新控件将派生自CWnd,原因如下:

  • 工具栏包含了大量与Header Bar控件无关的功能。
  • 如果使用工具栏控件,将需要将基类设置为私有或受保护的,这在MFC中难以使用和解释。
  • 控制应该围绕工具栏窗口是一个轻量级的包装器,而工具栏控件的开销太大,掩盖了尝试做的事情。

为此,复制了工具栏控件的代码,并移除了所有与Header Bar控件无关的函数。然后提供了添加按钮到左侧和右侧的公共函数。

为了保持MFC窗口的风格,创建函数的第一个参数是一个样式参数,因此这个参数不能默认。在HeaderBar.h文件的顶部有一个定义HEADERBAR_DEFSTYLE,它有推荐的默认样式。内部唯一强制的样式是CCS_NODIVIDER和TBSTYLE_CUSTOMERASE。

提供了AddLeftButton和AddRightButton函数,用于在Header Bar的左侧或右侧添加按钮。这隐含了一个假设,即按钮ID永远不会是零,因为这个ID是为分隔符按钮保留的,此外用户只会在左侧或右侧添加一个按钮,因此Header Bar控件中最多有三个按钮。如果这些条件不满足,将触发一个断言。

当在左侧或右侧添加按钮时,使用AdjustSeperatorButtonSize函数重新计算分隔符按钮的大小。

下一个开发阶段是处理分隔符条的自定义绘制,使下拉按钮看起来是主下拉按钮的一部分,而不是被分隔符条分开。将自定义绘制与控件关联的最简单方法是使用消息反射。这在MFC提供的Win32文档中有所介绍,位于technote 62下。

最后阶段是确保Header Bar控件能够成功地与MFC中的文档视图架构共存。当Windows需要调整主框架大小时,它会调用RecalcLayout函数,然后使用RepositionBars函数重新定位控件。然后调用函数会通过发送WM_SIZEPARENT消息到窗口来获取子控件占用的矩形,这些控件不是视图。这也给了控件重新定位自己的机会。框架中的剩余空间然后分配给视图。

使用代码

使用CHeaderBarCtrl是一个相当直接的练习。通常,栏将在主框架窗口的OnCreate函数中创建。在CMainFrame类中创建一个CHeaderBarCtrl类的成员变量,然后在OnCreate函数中创建一个新的窗口实例,记住要设置样式,因为这不会自动设置。(可以使用HEADERBAR_DEFSTYLE定义作为默认值)接下来添加位图(如果使用的话)和任何字符串,最后添加左侧和右侧按钮到Header控件并设置所有者。创建和设置控件就是这样。

接下来使用AddLeftButton和AddRightButton命令添加左侧和右侧按钮。

需要执行的最后步骤是添加按钮被按下时的命令处理程序。这些可以在文档或视图中完成。个人更喜欢在视图中完成,这也是实现中的方式。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485