演练:将控件放入工具栏
本主题介绍如何将包含一个 windows 控件到工具栏的工具栏按钮。 在 MFC 中,工具栏按钮必须是 CMFCToolBarButton 类派生类,如 CMFCToolBarComboBoxButton 类、 CMFCToolBarEditBoxButton 类、 CMFCDropDownToolbarButton 类或 CMFCToolBarMenuButton 类。
将控件添加到工具栏
若要将控件添加到工具栏,请执行以下步骤:
保留虚拟资源 ID 在父工具栏资源的按钮。 有关如何创建按钮的更多信息可以使用工具栏在 Visual Studio 中编辑,请参见 工具栏编辑器 主题。
保留工具栏图像 (按钮图标) 在父工具栏的任意位图按钮的。
在处理 AFX_WM_RESETTOOLBAR 消息的消息处理程序,请执行以下操作:
构造按钮控件使用 CMFCToolbarButton派生类。
使用 CMFCToolBar::ReplaceButton,用新的控件替换虚假的按钮。 ,因为 ReplaceButton 复制按钮对象并维护该副本,可构造堆栈上的按钮对象。
备注
如果启用了应用程序的自定义项,则可能必须重新设置工具栏通过在 自定义 对话框的 工具栏 选项的 重置 按钮在重新编译后会在您的应用程序的更新控件。toolbar 状态在 windows 注册表中保存,并且,注册表信息加载并通过应用在应用程序启动过程后,,在 ReplaceButton 方法执行。
工具栏控件和自定义
自定义 对话框的 命令 选项卡包含可在整个应用程序命令的列表。 默认情况下, 自定义 对话框在每个菜单类处理应用程序菜单和生成标准工具栏按钮列表。 若要保留工具栏控件的扩展功能请提供,必须用 自定义 对话框的自定义控件替换标准工具栏按钮。
当您启用自定义项时,使用 CMFCToolBarsCustomizeDialog 类 类,可以在自定义处理程序 OnViewCustomize 创建 自定义 对话框。 在通过调用 CMFCToolBarsCustomizeDialog::Create显示 自定义 对话框之前,调用 CMFCToolBarsCustomizeDialog::ReplaceButton 使用新控件替换标准按钮。
示例:创建查找组合框
本节介绍如何创建显示在工具栏并包含最近使用的搜索字符串的 Find 组合框控件。 用户可以键入该控件的字符串然后按 enter 键搜索文档,或按 ESCAPE 键返回焦点到主框架。 此示例假定,文档在 CEditView 类派生的视图中突出显示。
创建查找控件
首先,创建 Find 组合框控件:
添加按钮及其命令向应用程序资源:
在应用程序资源,添加具有 ID_EDIT_FIND 命令 ID 的新按钮向应用程序的工具栏和到任意位图与工具栏。
在 ID_EDIT_FIND 命令 ID. 创建新的菜单项
添加一个新字符串 “查找文本 \ nFind”到字符串表并将其分配 ID_EDIT_FIND_COMBO 命令 ID. 此 ID 将用作 Find 组合框按钮的命令 ID。
备注
由于 ID_EDIT_FIND 由 CEditView处理的标准命令,不需要实现此命令的特殊处理程序。但是,您必须实现新命令的 ID_EDIT_FIND_COMBO处理程序。
创建一个新类, CFindComboBox,从派生 CComboBox 类。
在 CFindComboBox 类,请重写 PreTranslateMessage 虚方法。 此方法将使组合框处理 WM_KEYDOWN 消息。 如果用户按 ESCAPE 键 (VK_ESCAPE),则返回焦点到主框架窗口。 如果用户按 enter 键 (VK_ENTER),请传递到主框架窗口包含 ID_EDIT_FIND_COMBO 命令 ID. 的 WM_COMMAND 消息
创建 Find 组合框按钮的类,从派生 CMFCToolBarComboBoxButton 类。 在本示例中,名为 CFindComboButton。
CMFCToolbarComboBoxButton 构造函数采用三个参数:按钮、按钮图像索引和组合框的样式的命令 ID。 设置这些参数如下所示:
通过 ID_EDIT_FIND_COMBO 为命令 ID.
使用 CCommandManager::GetCmdImage 和 ID_EDIT_FIND 获取图像索引。
有关可用的组合框样式列表,请参见 组合框样式。
在 CFindComboButton 类中,重写 CMFCToolbarComboBoxButton::CreateCombo 方法。 您应创建 CFindComboButton 对象并返回指向它。
使用 IMPLEMENT_SERIAL 宏使组合按钮不可变。 工作区管理器自动加载和保存在 windows 注册表中按钮的状态。
实现您的 ID_EDIT_FIND_COMBO 处理程序文档视图。 使用 CMFCToolBar::GetCommandButtons 和 ID_EDIT_FIND_COMBO 检索所有 Find 组合框按钮。 由于自定义项,可以有一个按钮的多个副本具有相同的命令 ID 的。
在 ID_EDIT_FIND 消息处理程序 OnFind,使用 CMFCToolBar::IsLastCommandFromButton 确定查找命令是从 Find 组合框按钮发送了。 如果是这样,找到该文本并添加搜索字符串到组合框。
查找控件添加到主工具栏
若要添加组合框按钮添加到工具栏,请执行以下步骤:
实现主框架窗口的 AFX_WM_RESETTOOLBAR 消息处理程序 OnToolbarReset 。
备注
框架将此信息添加到主框架窗口在应用程序启动期间,那么,当工具栏初始化,或者,在工具栏中自定义项时重新设置。在任一情况下,您必须具有自定义 Find 组合框按钮替换标准工具栏按钮。
在 AFX_WM_RESETTOOLBAR 处理程序,请检查工具栏 ID,也就是说, AFX_WM_RESETTOOLBAR 消息的 WPARAM 。 如果工具栏 ID 与包含 Find 组合框按钮的是相等的工具栏,请调用 CMFCToolBar::ReplaceButton 替换 Find 按钮 (即具有命令 ID 的 ID_EDIT_FIND) 按钮与 CFindComboButton 对象。
备注
,因为 ReplaceButton 复制按钮对象并维护其副本,您可以构建在堆栈上的 CFindComboBox 对象。
添加查找控件绑定到自定义对话框
在自定义处理程序 OnViewCustomize,请调用 CMFCToolBarsCustomizeDialog::ReplaceButton 替换 Find 按钮 (即具有命令 ID 的 ID_EDIT_FIND) 按钮与 CFindComboButton 对象。