PenInputPanel 示例
此示例通过集成 PenInputPanel 对象基于自动声明表单示例生成。 该示例位于 AutoClaims 文件夹的 C# PIPanel 目录中。
注意
此示例要求系统配备笔设备。 如果只使用鼠标 (或其他非人机接口设备 (HID) 指向设备) 则不会显示 PenInputPanel 。
有关自动声明表单示例的详细信息,请参阅 自动声明表单示例。 有关 PenInputPanel 对象的详细信息,请参阅 使用 PenInputPanel 类对输入面板进行编程。
在示例中,“汽车索赔表单”包含五个字段,要求用户在其中输入与索赔相关的信息:保单编号、保险人姓名、年份、制造和汽车型号。 PenInputPanel 对象附加到每个输入字段,以提供使用笔输入值的简单方法。
可通过两种方法将 PenInputPanel 对象附加到窗体上的输入字段。 第一种方法是在设计时将 对象的单独实例分配给每个输入字段。 第二种是创建对象的单个实例,然后在运行时该对象实例在收到焦点时将其附加到字段。 此示例演示了这两种方法。
决定使用哪种技术需要权衡。 加载窗体时,为每个窗体字段创建 对象的唯一实例需要稍微多一些内存。 但是,它无需处理字段的焦点事件,以便在运行时将单个实例分配给当前字段。
由于 PenInputPanel 对象仅在平板电脑上受支持,因此该示例在异常处理块中创建 PenInputPanel 对象。
每个字段一个对象
该示例演示 (每个) 字段一个 PenInputPanel 对象的第一种方法,方法是将策略编号 (inkEdPolicyNumber
) 的输入字段和保险名称 inkEdName
(分配) PenInputPanel 对象的唯一实例。 PenInputPanel 对象的重载构造函数可以将输入控件的名称作为参数,从而关联控件。 窗体的 Load 事件处理程序中的以下行显示了这一点:
pipPolicyNumber = new PenInputPanel(inkEdPolicyNumber);
pipName = new PenInputPanel(inkEdName);
每个窗体一个对象
示例中还演示了第二种方法: PenInputPanel 对象的 pipShared
单个实例在 Year、Make 和 Model 输入字段之间共享。 共享对象是使用默认构造函数创建的。
pipShared = new PenInputPanel();
使用此技术要求窗体只有 PenInputPanel 对象的单个实例。 这可以节省内存,但必须在输入字段接收焦点时添加代码来处理事件。 当使用 PenInputPanel 对象的共享实例的控件获得焦点时,将 PenInputPanel 对象的 AttachedEditControl 属性设置为该控件。 以下代码显示了 Year、Make 和 Model 字段事件的 Enter
事件处理程序。
private void inkEdYear_Enter(object sender, System.EventArgs e)
{
// Attach the shared PenInputPanel to the Year field
pipShared.AttachedEditControl = inkEdYear;
// set the NUMBER factoid to bias recognition for numbers
pipShared.Factoid = "NUMBER";
// Enable correction UI on the inkEdYear field
pipShared.EnableTsf(true);
}
private void inkEdMake_Enter(object sender, System.EventArgs e)
{
// Attach the shared PenInputPanel to the Make field
pipShared.AttachedEditControl = inkEdMake;
// reset the factoid to bias recognition for general text
pipShared.Factoid = "DEFAULT";
// Enable correction UI on the inkEdMake field
pipShared.EnableTsf(true);
}
private void inkEdModel_Enter(object sender, System.EventArgs e)
{
// Attach the shared PenInputPanel to the Model field
pipShared.AttachedEditControl = inkEdModel;
// reset the factoid to bias recognition for general text
pipShared.Factoid = "DEFAULT";
// Enable correction UI on the inkEdModel field
pipShared.EnableTsf(true);
}
请确保设置当焦点更改为新控件时需要设置的任何属性。 例如,在前面的事件处理程序中, Factoid 属性是根据需要设置的。
可用性注意事项
在应用程序中使用 PenInputPanel 对象时,请记住以下可用性注意事项。
定位 PenInputPanel
由于本示例中的字段在窗体上垂直布局,因此每个输入控件的 PenInputPanel 用户界面都稍微放置在输入控件的右侧,使其更易于使用。 这可以防止 PenInputPanel 掩盖下一个编辑框,从而更轻松地定位下一个编辑框。
pipShared.HorizontalOffset = 32;
pipPolicyNumber.HorizontalOffset = 32;
pipName.HorizontalOffset = 32;
选择要显示的输入面板
由于策略编号通常是数字、字母和其他字符的组合,因此它们很容易识别错误。 因此,该示例将 PenInputPanel 对象显示的默认面板设置为附加到策略编号字段时的键盘。
pipPolicyNumber.DefaultPanel = PanelType.Keyboard;
PenInputPanel 对象的默认行为是使用用户上次选择的面板。
文本服务框架更正用户界面
在此示例中,所有输入字段都是 InkEdit 控件。 这一点很重要,因为 InkEdit 控件具有对 文本服务框架 (TSF) 的内置支持,因此能够支持从 PenInputPanel 对象接收的输入的就地更正用户界面。
EnableTsf 的默认值为 TRUE。 这会导致 PenInputPanel 对象尝试在附加控件上启动文本服务框架 (TSF) 。 如果成功,更正用户界面会显示在 控件中,并允许访问识别替代。 使用 FALSE 参数调用此方法会尝试关闭附加控件上的 TSF。
InkEdit 控件已提供更正用户界面,但在示例中,EnableTsf 用于使 PenInputPanel 能够使用 TSF 插入识别器上下文而不是 SendInput 函数将手写识别结果发送到控件中。 结果是即使字段不再具有焦点,也可以插入文本。
pipName.EnableTsf(true);
pipPolicyNumber.EnableTsf(true);
关闭窗体
在 Windows 窗体Designer生成的代码中,初始化窗体时,InkEdit 和 InkPicture 控件将添加到窗体的组件列表中。 当窗体关闭时,InkEdit 和 InkPicture 控件以及窗体的其他组件通过窗体的 Dispose 方法释放。 窗体的 Dispose 方法还释放为窗体创建的 Ink 对象。