在MFC应用程序开发中,经常需要实现一些自定义的控件来满足特定的用户界面需求。Header Bar控件就是其中一种常见的需求,它通常位于窗口的顶部,包含一些按钮或下拉按钮,用于提供导航或其他功能。本文将介绍如何在MFC中实现一个高质量的Header Bar控件,使其能够像标准的MFC控件库中的控件一样被开发者使用。
Header Bar控件的设计目标主要有三个:
Header Bar控件应该能够在主窗口的左侧或右侧添加一个按钮或下拉按钮。这个按钮然后会向主框架窗口发送一个命令,该命令将被路由到当前视图或文档,就像MFC中的任何正常消息一样。
在Inbox应用程序中,Header Bar控件是一个工具栏公共控件,因此可以选择是派生自CToolbarCtrl还是CWnd。最终决定新控件将派生自CWnd,原因如下:
为此,复制了工具栏控件的代码,并移除了所有与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命令添加左侧和右侧按钮。
需要执行的最后步骤是添加按钮被按下时的命令处理程序。这些可以在文档或视图中完成。个人更喜欢在视图中完成,这也是实现中的方式。