用户定义的工具
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 ID_USER_TOOL1
到 ID_USER_TOOL10
是保留给用户定义的工具使用的。 类 CUserTool 类处理对用户工具的调用。 “自定义”对话框的工具选项卡在参数和目录条目字段右侧提供了按钮,用于访问菜单“IDR_MENU_ARGS”和“IDR_MENU_DIRS”。当用户从其中一个菜单中选择命令时,框架会将资源 ID 等同于命令 ID 的字符串附加到相应的文本框中。
包括预定义工具
如果要在应用程序启动时预定义一些工具,必须替代应用程序主窗口的 CFrameWnd::LoadFrame 方法。 在该方法中,必须执行以下步骤。
在 LoadFrame 中添加新工具
通过调用 CWinAppEx::GetUserToolsManager 获取指向 CUserToolsManager 类对象的指针。
对于要创建的每个工具,调用 CUserToolsManager::CreateNewTool。 此方法会返回一个指向 CUserTool 类对象的指针,并将新创建的用户工具添加到工具的内部集合。 如果你提供了 CUserTool 类的派生类(作为 CWinAppEx::EnableUserTools 的第四个参数)的运行时信息,CUserToolsManager::CreateNewTool 将改为实例化并返回该类的实例。
对于每个工具,设置
CUserTool::m_strLabel
可设置其文本标签,调用CUserTool::SetCommand
可设置其命令。 CUserTool 类的默认实现会自动从调用SetCommand
时指定的程序中检索可用图标。