MFC 支持用户定义的工具。 用户定义的工具是执行外部用户指定程序的特殊命令。 可以使用自定义过程来管理用户定义的工具。 但是,如果应用程序对象不是从 CWinAppEx 类派生的,则不能使用此过程。 有关自定义的详细信息,请参阅 MFC 的自定义。
如果启用了用户定义的工具支持,自定义对话框会自动包含 “工具 ”选项卡。下图显示了 “工具” 页。
“自定义”对话框“工具”选项卡
启用用户定义的工具支持
若要在应用程序中启用用户定义的工具,请调用 CWinAppEx::EnableUserTools。 但是,必须先在应用程序的资源文件中定义多个常量,以用作此调用的参数。
在资源编辑器中创建使用适当命令 ID 的虚拟命令。 在以下示例中,我们将用作 ID_TOOLS_ENTRY
命令 ID。 此命令 ID 标记框架将插入用户定义的工具的一个或多个菜单中的位置。
必须在字符串表中保留一些连续 ID 来表示用户定义的工具。 预留的字符串数等于用户可定义的最大用户工具数。 在下面的示例中,这些名称通过命名ID_USER_TOOL1
。ID_USER_TOOL10
你可以向用户提供建议,帮助他们为将作为工具调用的外部程序选择目录和参数。 为此,请在资源编辑器中创建两个弹出菜单。 在下面的示例中,这些名称 IDR_MENU_ARGS
命名和 IDR_MENU_DIRS
。 对于这些菜单中的每个命令,请在应用程序字符串表中定义一个字符串。 字符串的资源 ID 必须等于命令 ID。
还可以从 CUserTool 类 创建派生类来替换默认实现。 为此,请将派生类的运行时信息作为 CWinAppEx::EnableUserTools 中的第四个参数传递,而不是 RUNTIME_CLASS(CUserTool 类)。
定义适当的常量后,调用 CWinAppEx::EnableUserTools 以启用用户定义的工具。
以下方法调用演示如何使用这些常量:
EnableUserTools(ID_TOOLS_ENTRY,
ID_USER_TOOL1,
ID_USER_TOOL10,
RUNTIME_CLASS(CUserTool),
IDR_MENU_ARGS,
IDR_MENU_DIRS);
在此示例中,“ 自定义 ”对话框中将包含“工具”选项卡。 每当用户打开该菜单时,框架将替换任何与任何菜单中命令 ID 匹配的命令与 ID_TOOLS_ENTRY
当前定义的用户工具集匹配的任何命令。 命令 ID_USER_TOOL10
ID ID_USER_TOOL1
保留用于用户定义的工具。
类 CUserTool 类处理对用户工具的调用。 “ 自定义 ”对话框的工具选项卡提供参数和目录条目字段右侧的按钮,用于访问 菜单IDR_MENU_ARGS 和 IDR_MENU_DIRS。当用户从其中一个菜单中选择命令时,框架将追加到相应的文本框中,该字符串的资源 ID 等于命令 ID。
包括预定义工具
如果要在应用程序启动时预定义某些工具,则必须替代应用程序主窗口的 CFrameWnd::LoadFrame 方法。 在该方法中,必须执行以下步骤。
在 LoadFrame 中添加新工具
通过调用 CWinAppEx::GetUserToolsManager 获取指向 CUserToolsManager类对象的指针。
对于要创建的每个工具,请调用 CUserToolsManager::CreateNewTool。 此方法返回指向 CUserTool 类 对象的指针,并将新创建的用户工具添加到工具的内部集合中。 如果将 CUserTool 类 派生类的运行时信息作为 CWinAppEx::EnableUserTools 的第四个参数提供, 则 CUserToolsManager::CreateNewTool 将实例化并返回该类的实例。
对于每个工具,通过设置并调用
CUserTool::SetCommand
设置其命令来设置CUserTool::m_strLabel
其文本标签。 CUserTool 类的默认实现会自动从调用SetCommand
中指定的程序检索可用图标。