PenInputPanel Sample

Este ejemplo se basa en el ejemplo de formulario de notificaciones automáticas mediante la integración del objeto PenInputPanel . El ejemplo se encuentra en el directorio PIPanel de C# en la carpeta AutoClaims.

Nota

Este ejemplo requiere que el sistema esté equipado con un dispositivo de lápiz. Si usa solo un mouse (u otro dispositivo de interfaz no humana (HID) que apunte), el PenInputPanel no aparece.

 

Para obtener más información sobre el ejemplo de formulario de notificaciones automáticas, vea Ejemplo de formulario de notificaciones automáticas. Para obtener más información sobre el objeto PenInputPanel , vea Programar el panel de entrada mediante la clase PenInputPanel.

En el ejemplo, el formulario de reclamaciones automáticas contiene cinco campos en los que se pide al usuario que ponga información relevante para la reclamación: número de directiva, nombre asegurado, año, marca y modelo del coche. Un objeto PenInputPanel se adjunta a cada campo de entrada para proporcionar un medio sencillo para escribir valores con un lápiz.

Hay dos técnicas para adjuntar un objeto PenInputPanel a los campos de entrada del formulario. La primera técnica consiste en asignar una instancia independiente del objeto a cada campo de entrada en tiempo de diseño. El segundo consiste en crear una única instancia del objeto y, a continuación, adjuntar esa instancia de objeto en tiempo de ejecución a un campo cuando recibe el foco. En este ejemplo se muestran ambas técnicas.

Hay inconvenientes en decidir qué técnica usar. La creación de una instancia única del objeto para cada campo de formulario requiere algo más de memoria cuando se carga el formulario. Sin embargo, ahorra tener que controlar los eventos de foco para que los campos asignen una única instancia al campo actual en tiempo de ejecución.

Dado que el objeto PenInputPanel solo se admite en un equipo tablet, el ejemplo crea los objetos PenInputPanel dentro de un bloque de control de excepciones.

Un objeto por campo

En el ejemplo se muestra la primera técnica (un objeto PenInputPanel por campo) asignando los campos de entrada para el número de directiva (inkEdPolicyNumber) y el nombre asegurado (inkEdName) una instancia única del objeto PenInputPanel. Un constructor sobrecargado para el objeto PenInputPanel puede tomar el nombre del control de entrada como argumento, asociando así los controles. Las siguientes líneas del controlador de eventos Load del formulario muestran lo siguiente:

pipPolicyNumber = new PenInputPanel(inkEdPolicyNumber);
pipName = new PenInputPanel(inkEdName);

Un objeto por formulario

La segunda técnica también se muestra en el ejemplo: una única instancia de un objeto PenInputPanel , pipShared, se comparte entre los campos de entrada Year, Make y Model. El objeto compartido se crea mediante el constructor predeterminado.

pipShared = new PenInputPanel();

El uso de esta técnica requiere que el formulario tenga solo una instancia del objeto PenInputPanel . Esto guarda memoria, pero debe agregar código para controlar el evento cuando un campo de entrada recibe el foco. Cuando un control que usa una instancia compartida de un objeto PenInputPanel obtiene el foco, establezca la propiedad AttachedEditControl del objeto PenInputPanel en ese control. En el código siguiente se muestra un controlador de eventos para los eventos de los campos Enter Year, Make y Model.

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);
}

Asegúrese de establecer las propiedades que deben establecerse cuando el foco cambie a un nuevo control. En los controladores de eventos anteriores, por ejemplo, la propiedad Factoid se establece según corresponda.

Consideraciones sobre la facilidad de uso

Tenga en cuenta las siguientes consideraciones de facilidad de uso al usar el objeto PenInputPanel en la aplicación.

Colocación del PenInputPanel

Dado que los campos se disponen verticalmente en el formulario de este ejemplo, la interfaz de usuario PenInputPanel para cada control de entrada se coloca ligeramente a la derecha del control de entrada para facilitar el uso. Esto impide que PenInputPanel cubra el siguiente cuadro de edición, lo que facilita el destino del siguiente cuadro de edición.

pipShared.HorizontalOffset = 32;
pipPolicyNumber.HorizontalOffset = 32;
pipName.HorizontalOffset = 32;

Selección del panel de entrada para mostrar

Dado que los números de directiva suelen ser combinaciones de números, letras y otros caracteres, pueden ser propensos a errores de reconocimiento. Por lo tanto, el ejemplo establece el panel predeterminado mostrado por el objeto PenInputPanel para que sea el teclado cuando se adjunta al campo de número de directiva.

pipPolicyNumber.DefaultPanel = PanelType.Keyboard;

El comportamiento predeterminado del objeto PenInputPanel es usar el panel que el usuario seleccionó por última vez.

Interfaz de usuario de corrección del marco de Text Services

En este ejemplo, todos los campos de entrada son controles InkEdit . Esto es importante porque el control InkEdit tiene compatibilidad integrada con Text Services Framework (TSF) y, por tanto, es capaz de admitir la interfaz de usuario de corrección local para la entrada recibida del objeto PenInputPanel .

El valor predeterminado de EnableTsf es TRUE. Esto hace que el objeto PenInputPanel intente iniciar Text Services Framework (TSF) en el control adjunto. Si se ejecuta correctamente, la interfaz de usuario de corrección se muestra en el control y permite el acceso a alternativas de reconocimiento. Llamar a este método con un parámetro FALSE intenta apagar TSF en el control asociado.

El control InkEdit ya proporciona una interfaz de usuario de corrección, pero en el ejemplo EnableTsf se usa para permitir que PenInputPanel use el contexto del reconocedor de inserción de TSF en lugar de la función SendInput para enviar los resultados del reconocimiento de escritura a mano al control. El resultado es que el texto se puede insertar incluso si el campo ya no tiene el foco.

  pipName.EnableTsf(true);
  pipPolicyNumber.EnableTsf(true);

Cerrar el formulario

En windows Forms Designer código generado, los controles InkEdit e InkPicture se agregan a la lista de componentes del formulario cuando se inicializa el formulario. Cuando se cierra el formulario, los controles InkEdit e InkPicture se eliminan, así como los demás componentes del formulario, mediante el método Dispose del formulario. El método Dispose del formulario también elimina los objetos Ink que se crean para el formulario.