Visual Components 在适用于 Windows 的 FRE 中实现。
ABBYY FineReader Engine Visual Components 提供的大多数功能都可以通过其上下文菜单和工具栏 (如果有) 来访问。上下文菜单和工具栏中的命令适用于大多数常见使用场景。不过,您可能需要根据具体任务自定义其中的元素。
Image Viewer、Text Editor、Document Viewer 提供工具栏。您可以向工具栏添加新按钮,并移除多余的按钮。这些按钮既可以是预定义按钮,也可以是您自己创建的按钮。
Image Viewer、Zoom Viewer、Text Editor、Document Viewer 提供上下文菜单。每个组件的上下文菜单都包含标准部分和自定义部分:
- 上下文菜单的标准部分是组件默认显示的上下文菜单。此部分无法更改。您只能控制该部分菜单是否显示。
- 上下文菜单的自定义部分可以编辑。默认情况下,它为空。您可以将该组件可用的任何标准命令或任何用户定义命令添加到上下文菜单的这一部分。上下文菜单的自定义部分始终显示在标准部分之后。上下文菜单的自定义部分也可以启用或禁用。
您可以在 MenuItemEnum 枚举常量中找到 Visual Components 中所有可用命令的完整列表。ImageViewer、ZoomViewer、DocumentViewer、TextEditor 对象的 Commands 子对象提供对各组件中可用命令的访问。
可通过以下方式调用命令:
- 从上下文菜单中选择项目,
- 单击工具栏按钮,
- 按下快捷键,
- 使用组件的 Commands 子对象的 DoCommand 方法。
但并非所有方式都适用于每个命令。各组件中可用命令及其调用方式的列表如下:
要启用或禁用某个命令,请使用 Commands 对象的 EnableCommand 或 DisableCommand 方法。禁用某个命令后,该命令的所有可用调用方式均将失效。
部分预定义命令默认显示在工具栏上,其余命令可由开发者添加到组件的工具栏中。请参阅各组件可用预定义命令的列表。
要将预定义命令添加到工具栏或从工具栏中删除:
- 通过组件的 Toolbar 属性获取 Toolbar 对象。
- 使用 Toolbar 对象的 InsertAt 方法将命令插入工具栏中的指定位置,或使用 Delete 或 DeleteAt 方法将其删除。
您可以使用分隔符对工具栏上的按钮进行分组。将 MI_Separator 常量作为参数,调用 Toolbar 对象的 InsertAt 方法即可实现。
// 我们将预定义命令 MI_InvertImage 添加到 Image Viewer 工具栏的开头
private FineReaderVisualComponents.AxImageViewer imageViewer;
imageViewer.Toolbar.InsertAt(FineReaderVisualComponents.MenuItemEnum.MI_InvertImage, 0);
预定义命令添加完成后,即可在应用程序中使用。ABBYY FineReader Engine 将处理相应的事件。您也可以通过 ICommandEvents 接口的 OnCommand 事件,为处理程序扩展额外的功能。
某些预定义命令默认在上下文菜单中可用——这些命令构成了上下文菜单的标准部分。组件中其他所有可用的预定义命令都可以添加到上下文菜单的自定义部分。
要将预定义命令添加到上下文菜单的自定义部分或将其移除,请执行以下操作:
- 通过组件的 PopupMenu 属性获取 PopupMenu 对象。
- 如果不需要使用上下文菜单的整个标准部分,请使用 PopupMenu 对象的 StandardMenuEnabled 属性将其禁用。默认情况下,标准部分处于启用状态。
- 使用 PopupMenu 对象的 CustomMenuEnabled 属性启用上下文菜单的自定义部分。
- 使用 PopupMenu 对象的 InsertAt 方法,将命令插入到上下文菜单自定义部分中的指定位置;或者使用 Delete 或 DeleteAt 方法将其移除。
你可以使用分隔符对上下文菜单自定义部分中的项目进行分组。使用 PopupMenu 对象的 InsertAt 方法,并将 MI_Separator 常量作为参数。
// 将预定义命令 MI_InvertImage 添加到 Image Viewer 上下文菜单自定义部分的开头
private FineReaderVisualComponents.AxImageViewer imageViewer;
imageViewer.PopupMenu.StandardMenuEnabled = false;
imageViewer.PopupMenu.CustomMenuEnabled = true;
imageViewer.PopupMenu.InsertAt(FineReaderVisualComponents.MenuItemEnum.MI_InvertImage, 0);
添加预定义命令后,即可在应用程序中使用。相应事件由 ABBYY FineReader Engine 处理。你还可以使用 ICommandEvents 接口的 OnCommand 事件,为处理程序补充一些附加功能。
您还可以创建自己的命令,并将其添加到工具栏或上下文菜单中。MenuItemEnum 枚举包含常量 (MI_CustomCommand1, … MI_CustomCommand10),可用于定义您自己的命令。
在添加自定义命令之前,您需要为其工具栏按钮创建一个图标 (16х16 px) ,并想好命令文本。然后,您应在组件中注册该命令,并将其添加到工具栏或上下文菜单的自定义部分。详见下文。
要添加用户命令:
- 在组件中注册该命令。使用组件的 Commands 子对象的 RegisterUserCommand 方法,并将 MI_CustomCommand1, … MI_CustomCommand10 常量中的任意一个作为参数。您还应在此方法的参数中指定图标路径、命令文本和快捷键。
快捷键由两部分组成:虚拟键码和键修饰符 (Ctrl、Alt、Shift) 。将快捷键传递给 FineReader Engine 方法时,快捷键应采用与发送 HKM_GETHOTKEY 消息后 Windows SendMessage 函数返回值 (LRESULT) 相同的格式。要获取这种格式的快捷键值,应将快捷键的虚拟键码打包到该值的低位字节中,并将用于指定快捷键组合的键修饰符打包到高位字节中。如果该命令不需要使用快捷键,请将 0 作为此方法的参数传递。
- 实现 ICommandEvents 接口的 OnCommand 事件,以处理新命令的事件。请参见 Working with Connectable Objects。
- 将该命令添加到组件的工具栏或上下文菜单的自定义部分。该过程与向工具栏或上下文菜单添加预定义命令相同。
完成后,该命令就可以在您的应用程序中使用。
private FineReaderVisualComponents.AxImageViewer imageViewer;
private FineReaderVisualComponents.AxTextEditor textEditor;
private const int HotkeyShift = 1;
private const int HotkeyControl = 2;
private const int HotkeyAlt = 4;
// 创建快捷键值
private int makeWord(int keyCode, int modifierFlags)
{
return (int)((uint)((byte)(keyCode)) | ((uint)((byte)(modifierFlags)) << 8));
}
// 添加自定义命令
private void addCommands()
{
…
int hotKey = makeWord((int)Keys.B, HotkeyShift);
imageViewer.Commands.RegisterUserCommand(FineReaderVisualComponents.MenuItemEnum.MI_CustomCommand1, "MyCommand", "D:\\img.bmp", hotKey);
imageViewer.Toolbar.InsertAt(FineReaderVisualComponents.MenuItemEnum.MI_CustomCommand1, 0);
imageViewer.Commands.OnCommand += new FineReaderVisualComponents.DICommandEvents_OnCommandEventHandler( imageViewer_OnCommand );
hotKey = makeWord((int)Keys.T, HotkeyAlt | HotkeyShift);
textEditor.Commands.RegisterUserCommand(FineReaderVisualComponents.MenuItemEnum.MI_CustomCommand1, "MyTextCommand", "", hotKey);
…
}
// Image Viewer 的 OnCommand 事件处理程序
private void imageViewer_OnCommand( FineReaderVisualComponents.MenuItemEnum command, out bool cancel ){
if( command == FineReaderVisualComponents.MenuItemEnum.MI_CustomCommand1 )
{
...
}
}
要移除之前添加的用户命令:
- 将其从工具栏或上下文菜单的自定义部分中移除。该过程与移除工具栏或上下文菜单中的预定义命令相同。
- 取消注册该命令。使用组件的 Commands 子对象的 UnregisterUserCommand 方法。
创建图形用户界面应用程序