演练:将控件置于工具栏上

本文介绍如何将一个包含 Windows 控件的工具栏按钮添加到工具栏。 在 MFC 中,工具栏按钮必须是 CMFCToolBarButton 类派生的类,例如 CMFCToolBarComboBoxButton 类CMFCToolBarEditBoxButton 类CMFCDropDownToolbarButton 类CMFCToolBarMenuButton 类

将控件添加到工具栏

若要将控件添加到工具栏,请执行以下步骤:

  1. 在父级工具栏资源中保留该按钮的虚拟资源 ID。 有关如何在 Visual Studio 中使用工具栏编辑器创建按钮的详细信息,请参见工具栏编辑器一文。

  2. 在父级工具栏的所有位图中保留该按钮的工具栏图像(按钮图标)。

  3. 在处理 AFX_WM_RESETTOOLBAR 消息的消息处理程序中,执行下列操作:

    1. 使用 CMFCToolbarButton 派生的类构造此按钮控件。

    2. 使用 CMFCToolBar::ReplaceButton 将虚拟按钮替换为新控件。 可在堆栈上构造按钮对象,因为 ReplaceButton 会复制按钮对象并保留副本。

注意

如果在应用程序中启用了自定义,则可能必须使用“自定义”对话框的“工具栏”选项卡上的“重置”按钮来重置此工具栏,以查看重新编译后应用程序中已更新的控件。 工具栏状态将保存在 Windows 注册表中,并且在应用程序启动期间,在执行 ReplaceButton 方法后将加载并应用注册表信息。

工具栏控件和自定义

“自定义”对话框的“命令”选项卡包含一个应用程序中可用的命令的列表。 默认情况下,“自定义”对话框处理应用程序菜单并在每个菜单类别中生成标准工具栏按钮的列表。 若要保留工具栏控件提供的扩展功能,必须将标准工具栏按钮替换为“自定义”对话框中的自定义控件。

在启用自定义时,可使用 CMFCToolBarsCustomizeDialog Class 类在自定义处理程序 OnViewCustomize 中创建“自定义”对话框。 通过调用 CMFCToolBarsCustomizeDialog::Create 显示自定义对话框之前,调用 CMFCToolBarsCustomizeDialog::ReplaceButton 将标准按钮替换成新控件。

示例:创建一个 Find 组合框

本节介绍如何创建查找组合框控件,此控件显示在工具栏上并包含最近使用的搜索字符串。 用户可在控件中键入一个字符串,然后按 Enter 键来搜索文档,或按 Esc 键将焦点返回主框架。 此示例假定文档显示在 CEditView 类派生的视图中。

创建 Find 控件

首先,创建查找组合框控件:

  1. 将此按钮及其命令添加到应用程序资源:

    1. 在应用程序资源中,将命令 ID 为 ID_EDIT_FIND 的新按钮添加到应用程序中的工具栏以及与此工具栏相关的任何位图。

    2. 使用 ID_EDIT_FIND 命令 ID 创建新的菜单项。

    3. 将新字符串“Find the text\nFind”添加到字符串表并为其分配 ID_EDIT_FIND_COMBO 命令 ID。 此 ID 将用作查找组合框按钮的命令 ID。

      注意

      由于 ID_EDIT_FIND 是一个由 CEditView 处理的标准命令,因此您不需要为此命令实现特殊处理程序。 但是,您必须实现新命令 ID_EDIT_FIND_COMBO 的处理程序。

  2. 创建派生自 CComboBox 类派生的新类 CFindComboBox

  3. CFindComboBox 类中,重写 PreTranslateMessage 虚方法。 此方法使组合框能够处理 WM_KEYDOWN 消息。 如果用户点击 Esc 键 (VK_ESCAPE),则将焦点返回到主框架窗口。 如果用户点击 Enter 键 (VK_ENTER),则会向主框架窗口发送一条包含 WM_COMMAND 命令 ID 的 ID_EDIT_FIND_COMBO 消息。

  4. 查找组合框按钮创建类,该类派生自 CMFCToolBarComboBoxButton 类。 在此示例中,命名为 CFindComboButton

  5. CMFCToolbarComboBoxButton 的构造函数具有三个参数:按钮的命令 ID、按钮图像索引和组合框的样式。 按以下方式设置这些参数:

    1. ID_EDIT_FIND_COMBO 作为命令 ID 传递。

    2. 使用 CCommandManager::GetCmdImageID_EDIT_FIND 获取图像索引。

    3. 有关可用组合框样式的列表,请参见组合框样式

  6. CFindComboButton 类中,重写 CMFCToolbarComboBoxButton::CreateCombo 方法。 在这里,您应创建 CFindComboButton 对象并返回一个指向该对象的指针。

  7. 使用 IMPLEMENT_SERIAL 宏使组合框按钮持久存在。 工作区管理器自动加载按钮状态并将其保存在 Windows 注册表中。

  8. 在文档视图中实现 ID_EDIT_FIND_COMBO 处理程序。 使用 CMFCToolBar::GetCommandButtonsID_EDIT_FIND_COMBO 检索所有查找组合框按钮。 由于自定义,因此存在具有同一命令 ID 的多个按钮副本。

  9. ID_EDIT_FIND 消息处理程序 OnFind 中,使用 CMFCToolBar::IsLastCommandFromButton 决定是否已从查找组合框按钮发送 find 命令。 如果是这样,则查找文本并将搜索字符串添加到组合框。

将 find 控件添加到主工具栏

若要将组合框按钮添加到工具栏,请执行以下步骤:

  1. 在主框架窗口中实现 AFX_WM_RESETTOOLBAR 消息处理程序 OnToolbarReset

    注意

    在应用程序启动期间初始化工具栏时或在自定义期间重置工具栏时,此框架会将该消息发送到主框架窗口。 在任一情况下,必须将标准工具栏按钮替换为自定义查找组合框按钮。

  2. AFX_WM_RESETTOOLBAR 处理程序中,检查工具栏 ID,即 AFX_WM_RESETTOOLBAR 消息的 WPARAM。 如果工具栏 ID 与包含查找组合框按钮的工具栏的 ID 相同,则调用 CMFCToolBar::ReplaceButton 以将查找按钮(即,命令 ID ID_EDIT_FIND) 的按钮)替换为 CFindComboButton 对象。

    注意

    您可以在堆栈上构造 CFindComboBox 对象,因为 ReplaceButton 会复制此按钮对象并保留副本。

将 Find 控件添加到“自定义”对话框

在自定义处理程序 OnViewCustomize 中,调用 CMFCToolBarsCustomizeDialog::ReplaceButton 以将查找 按钮(即,命令 ID ID_EDIT_FIND 的按钮)替换为 CFindComboButton 对象。

另请参阅

层次结构图

CMFCToolBar 类
CMFCToolBarButton 类
CMFCToolBarComboBoxButton 类
CMFCToolBarsCustomizeDialog 类