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生成的代码中,初始化窗体时,InkEditInkPicture 控件将添加到窗体的组件列表中。 当窗体关闭时,InkEdit 和 InkPicture 控件以及窗体的其他组件通过窗体的 Dispose 方法释放。 窗体的 Dispose 方法还释放为窗体创建的 Ink 对象。