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

本文介绍如何将包含 Windows 控件的工具栏按钮添加到工具栏。 在 MFC 中,工具栏按钮必须是 CMFCToolBarButton派生类,例如 CMFCToolBarComboBoxButton ClassCMFCToolBarEditBoxButton ClassCMFCDropDownToolbarButton ClassCMFCToolBarMenuButton Class

向工具栏添加控件

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

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

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

  3. 在处理 AFX_WM_RESETTOOLBAR 消息的消息处理程序中,执行以下步骤:

    1. 使用 CMFCToolbarButton-derived 类构造按钮控件。

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

注释

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

工具栏控件和自定义

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

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

示例:创建查找组合框

本部分介绍如何创建显示在工具栏上并包含最近使用的搜索字符串的 “查找 ”组合框控件。 用户可以在控件中键入字符串,然后按 Enter 键搜索文档,或按转义键将焦点返回到主帧。 此示例假定文档显示在 CEditView派生视图中。

创建查找控件

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

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

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

    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 消息。 如果用户命中转义键(VK_ESCAPE),将焦点返回到主帧窗口。 如果用户点击 Enter 键(VK_ENTER),则发布到主框架窗口,ID_EDIT_FIND_COMBO其中包含WM_COMMAND命令 ID 的消息。

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

  5. 构造函数 CMFCToolbarComboBoxButton 采用三个参数:按钮的命令 ID、按钮图像索引和组合框的样式。 按如下所示设置这些参数:

    1. ID_EDIT_FIND_COMBO 命令 ID 的形式传递。

    2. ID_EDIT_FIND用于CCommandManager::GetCmdImage获取图像索引。

    3. 有关可用组合框样式的列表,请参阅 Combo-Box 样式

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

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

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

  9. 在消息处理程序OnFindID_EDIT_FIND,用于CMFCToolBar::IsLastCommandFromButton确定是否从“查找”组合框按钮发送了 find 命令。 如果是,请找到文本并将搜索字符串添加到组合框。

将“查找”控件添加到主工具栏

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

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

    注释

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

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

    注释

    可以在堆栈上构造对象 CFindComboBox ,因为 ReplaceButton 复制按钮对象并维护副本。

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

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

另请参阅

层次结构图

CMFCToolBar
CMFCToolBarButton
CMFCToolBarComboBoxButton
CMFCToolBarsCustomizeDialog