本文介绍如何在工具栏上放置组合框或编辑框等各种控件。
例如,您要创建一个“Find”组合框,该组合框显示在工具栏上并包含最近使用的搜索字符串。用户可以在组合框编辑控件中键入搜索字符串,然后按Enter键搜索文档,或按退出键将焦点返回到主框架。该文档显示在CEditView派生的视图中。
以下步骤是“setup”工作,它处理组合框按钮的创建和命令的处理:
- 打开应用程序资源,将带有ID_EDIT_FIND命令ID的新按钮添加到所需(IDR_MAINFRAME)工具栏,并创建具有相同ID的新菜单项。使用ID_EDIT_FIND_COMBO命令ID将新字符串“Find the text \ nFind”添加到字符串表中。此ID将用作查找组合框按钮的命令ID。
注意。 ID_EDIT_FIND是CEditView处理的标准命令,因此您不需要为此命令实现特殊处理程序,但您需要为ID_EDIT_FIND_COMBO命令实现处理程序。 - 从CComboBox类派生一个类。我们将它命名为CFindComboBox。
- 在CFindComboBox类中,重写PreTranslateMessage虚拟成员函数。这将允许您首先处理WM_KEYDOWN消息并采取适当的操作。当用户点击转义键(VK_ESCAPE)时,它必须将焦点返回到主框架窗口。当用户点击回车键(VK_ENTER)时,它必须将带有ID_EDIT_FIND_COMBO命令ID的WM_COMMAND消息发布到主框架窗口(该命令将被路由到视图)。
- 从CBCGPToolbarComboBoxButton类派生一个类。我们将它命名为CFindComboButton。
- CBCGPToolbarComboBoxButton的构造函数有三个参数:按钮的命令ID,按钮图像的索引和组合框样式。您应该将ID_EDIT_FIND_COMBO作为命令ID传递,并且可以使用带有ID_EDIT_FIND的CImageHash :: GetImageOfCommand来获取图像索引。
- 覆盖CBCGPToolbarComboBoxButton :: CreateCombo成员函数。在这里,您应该创建CFindComboBox对象并返回指向它的指针。
- 使用IMPLEMENT_SERIAL宏使组合按钮持久化
- 在视图中实现ID_EDIT_FIND_COMBO处理程序。使用带有ID_EDIT_FIND_COMBO ID的CBCGPToolBar :: GetCommandButtons来检索所有“Find”组合框按钮。由于自定义,它可以是具有相同命令ID的组合框按钮的多个副本。
- 使用CBCGPToolBar :: IsLastCommandFromButton来确定是否从我们的组合框按钮发送了“Find”命令。如果是这样,找到文本并将搜索字符串添加到组合框。
您应该执行以下步骤将查找组合框按钮放到工具栏上:
- 在主框架窗口中实现BCGM_RESETTOOLBAR消息处理程序(OnToolbarReset)。
注意。当初始化工具栏(在应用程序启动时)或在自定义期间重置工具栏时,框架将此消息发送到主框架窗口。在任何一种情况下,您都需要使用“custom”查找组合框按钮替换标准工具栏按钮(请参阅步骤2)。 - 在OnToolbarReset处理程序中分析工具栏的ID(它是BCGM_RESETTOOLBAR消息的WPARAM)。当您遇到IDR_MAINFRAME工具栏时,只需使用ID_EDIT_FIND调用CBCGPToolBar :: ReplaceButton并引用CFindComboButton对象。
注意。您可以在堆栈上构造CFindComboButton对象,因为ReplaceButton复制按钮对象并维护副本。 - 如果启用自定义,则实现“customize”处理程序(OnViewCustomize)并创建CBCGPToolbarCustomize对话框。您必须使用ID_EDIT_FIND和对CFindComboButton对象的引用调用CBCGPToolbarCustomize :: ReplaceButton。
注意。自定义对话框包含“Commands”页面和“Commands”列表框。用户可以拖动命令并将其拖放到工具栏上。默认情况下,自定义对话框处理应用程序菜单并为每个类别构建标准工具栏按钮的列表。如果在需要时未通过CBCGPToolbarButton派生按钮替换标准工具栏按钮,则将失去派生对象提供的扩展功能。