Compartir a través de


Modelo de objetos de entrada manuscrita: COM y formularios Windows Forms frente a WPF

Actualización: noviembre 2007

Esencialmente, hay tres plataformas que admiten entradas manuscritas digitales: COM de Tablet PC, formularios Windows Forms de Tablet PC y Windows Presentation Foundation (WPF). Las plataformas COM y formularios Windows Forms comparten un modelo de objetos similar, pero el modelo de objetos de la plataforma WPF es sustancialmente diferente. En este tema se abordan las diferencias de alto nivel, para que los programadores que han trabajado con un modelo de objetos puedan entender mejor el otro.

Habilitar entradas manuscritas en una aplicación

Las tres plataformas se distribuyen con objetos y controles que permiten que las aplicaciones reciban la entrada de un lápiz de Tablet PC. Las plataformas COM y formularios Windows Forms se distribuyen con las clases InkPicture, InkEdit, InkOverlay y InkCollector. InkPicture y InkEdit son controles que se pueden agregar a una aplicación para recopilar entradas manuscritas. InkOverlay e InkCollector se pueden asociar a una ventana existente a fin de habilitar las ventanas y los controles personalizados para entradas manuscritas.

La plataforma WPF incluye el control InkCanvas. Puede agregar una clase InkCanvas a la aplicación y comenzar inmediatamente a recopilar entradas manuscritas. Con InkCanvas, el usuario puede copiar y seleccionar entradas manuscritas, así como ajustar su tamaño. Puede agregar a InkCanvas otros controles en los que el usuario también puede escribir a mano. Puede crear un control personalizado habilitado para entradas manuscritas si agrega una clase InkPresenter y recopila sus puntos de lápiz óptico.

En la tabla siguiente se muestra dónde obtener más información sobre cómo habilitar entradas manuscritas en una aplicación:

Para…

En la plataforma WPF…

En las plataformas COM y formularios Windows Forms…

Agregar a una aplicación un control habilitado para entradas manuscritas

Vea Introducción a las entradas manuscritas.

Vea Auto Claims Form Sample.

Habilitar entradas manuscritas en un control personalizado

Vea Creación de un control de entrada manuscrita.

Vea Ink Clipboard Sample.

Datos de las entradas manuscritas

En las plataformas COM y formularios Windows Forms, InkCollector, InkOverlay, InkEdit e InkPicture exponen un objeto Microsoft.Ink.Ink. El objeto Ink contiene los datos correspondientes a uno o más objetos Microsoft.Ink.Stroke y expone los métodos y propiedades comunes para administrar y manipular esos trazos. El objeto Ink administra la vigencia de los trazos que contiene; el objeto Ink crea y elimina los trazos que posee. Cada objeto Stroke tiene un identificador que es único dentro de su objeto Ink primario.

En la plataforma WPF, la clase System.Windows.Ink.Stroke posee y administra su propia vigencia. Puede recopilarse un grupo de objetos Stroke juntos en un objeto StrokeCollection, que proporciona los métodos para las operaciones comunes de administración de datos de las entradas manuscritas, tales como pruebas de posicionamiento, borrado, transformación y serialización de entradas manuscritas. Un objeto Stroke puede pertenecer a cero, uno o más objetos StrokeCollection en cualquier momento dado. En lugar de tener un objeto Microsoft.Ink.Ink, InkCanvas e InkPresenter contienen un objeto System.Windows.Ink.StrokeCollection.

En las dos ilustraciones siguientes se comparan los modelos de objetos de datos de entrada manuscrita. En las plataformas COM y formularios Windows Forms, el objeto Microsoft.Ink.Ink limita la vigencia de los objetos Microsoft.Ink.Stroke y los paquetes del lápiz óptico pertenecen a los trazos individuales. Dos o más trazos pueden hacer referencia al mismo objeto Microsoft.Ink.DrawingAttributes, como se muestra en la ilustración siguiente.

Diagrama del modelo de objeto de entrada manuscrita para COM/formularios Windows Forms.

En WPF, cada objeto System.Windows.Ink.Stroke es un objeto de Common Language Runtime que existe mientras algo haga referencia a él. Cada Stroke hace referencia a un objeto StylusPointCollection y a un objeto System.Windows.Ink.DrawingAttributes, que también son objetos de Common Language Runtime.

Diagrama del modelo de objeto de entrada manuscrita para WPF.

En la tabla siguiente se compara cómo lograr algunas tareas comunes en la plataforma WPF y en las plataformas COM y formularios Windows Forms.

Tarea

Windows Presentation Foundation

COM y formularios Windows Forms

Guardar entradas manuscritas

Save

Save

Cargar entradas manuscritas

Un objeto StrokeCollection se crea con el constructor StrokeCollection.StrokeCollection(Stream).

Load

Prueba de posicionamiento

HitTest

HitTest

Copiar entradas manuscritas

CopySelection

ClipboardCopy

Pegar entradas manuscritas

Paste

ClipboardPaste

Tener acceso a las propiedades personalizadas en una colección de trazos

AddPropertyData (las propiedades se almacenan internamente y se obtiene acceso a ellas a través de AddPropertyData, RemovePropertyData y ContainsPropertyData).

Use ExtendedProperties

Compartir entradas manuscritas entre plataformas

Aunque las plataformas tienen modelos de objetos diferentes para los datos de entrada manuscrita, compartir los datos entre las plataformas es muy fácil. En los ejemplos siguientes se guardan las entradas manuscritas de una aplicación de Windows Forms y se cargan en una aplicación de Windows Presentation Foundation.

Imports Microsoft.Ink
Imports System.Drawing


...


'/ <summary>
'/ Saves the digital ink from a Windows Forms application.
'/ </summary>
'/ <param name="inkToSave">An Ink object that contains the 
'/ digital ink.</param>
'/ <returns>A MemoryStream containing the digital ink.</returns>
Function SaveInkInWinforms(ByVal inkToSave As Ink) As MemoryStream 
    Dim savedInk As Byte() = inkToSave.Save()

    Return New MemoryStream(savedInk)

End Function 'SaveInkInWinforms
using Microsoft.Ink;
using System.Drawing;


...


/// <summary>
/// Saves the digital ink from a Windows Forms application.
/// </summary>
/// <param name="inkToSave">An Ink object that contains the 
/// digital ink.</param>
/// <returns>A MemoryStream containing the digital ink.</returns>
MemoryStream SaveInkInWinforms(Ink inkToSave)
{
    byte[] savedInk = inkToSave.Save();

    return (new MemoryStream(savedInk));

}
Imports System.Windows.Ink



...


'/ <summary>
'/ Loads digital ink into a StrokeCollection, which can be 
'/ used by a WPF application.
'/ </summary>
'/ <param name="savedInk">A MemoryStream containing the digital ink.</param>
Public Sub LoadInkInWPF(ByVal inkStream As MemoryStream) 
    strokes = New StrokeCollection(inkStream)

End Sub 'LoadInkInWPF

using System.Windows.Ink;


...


/// <summary>
/// Loads digital ink into a StrokeCollection, which can be 
/// used by a WPF application.
/// </summary>
/// <param name="savedInk">A MemoryStream containing the digital ink.</param>
public void LoadInkInWPF(MemoryStream inkStream)
{
    strokes = new StrokeCollection(inkStream);
}

En los ejemplos siguientes se guardan las entradas manuscritas de una aplicación de Windows Presentation Foundation y se cargan en una aplicación de Windows Forms.

Imports System.Windows.Ink



...


'/ <summary>
'/ Saves the digital ink from a WPF application.
'/ </summary>
'/ <param name="inkToSave">A StrokeCollection that contains the 
'/ digital ink.</param>
'/ <returns>A MemoryStream containing the digital ink.</returns>
Function SaveInkInWPF(ByVal strokesToSave As StrokeCollection) As MemoryStream 
    Dim savedInk As New MemoryStream()

    strokesToSave.Save(savedInk)

    Return savedInk

End Function 'SaveInkInWPF

using System.Windows.Ink;


...


/// <summary>
/// Saves the digital ink from a WPF application.
/// </summary>
/// <param name="inkToSave">A StrokeCollection that contains the 
/// digital ink.</param>
/// <returns>A MemoryStream containing the digital ink.</returns>
MemoryStream SaveInkInWPF(StrokeCollection strokesToSave)
{
    MemoryStream savedInk = new MemoryStream();

    strokesToSave.Save(savedInk);

    return savedInk;
}
Imports Microsoft.Ink
Imports System.Drawing


...


'/ <summary>
'/ Loads digital ink into a Windows Forms application.
'/ </summary>
'/ <param name="savedInk">A MemoryStream containing the digital ink.</param>
Public Sub LoadInkInWinforms(ByVal savedInk As MemoryStream) 
    theInk = New Ink()
    theInk.Load(savedInk.ToArray())

End Sub 'LoadInkInWinforms
using Microsoft.Ink;
using System.Drawing;


...


/// <summary>
/// Loads digital ink into a Windows Forms application.
/// </summary>
/// <param name="savedInk">A MemoryStream containing the digital ink.</param>
public void LoadInkInWinforms(MemoryStream savedInk)
{
    theInk = new Ink();
    theInk.Load(savedInk.ToArray());
}

Eventos del lápiz de Tablet PC

Las clases InkOverlay, InkCollector e InkPicture de las plataformas COM y formularios Windows Forms reciben los eventos cuando el usuario introduce datos con el lápiz. InkOverlay o InkCollector se asocian a una ventana o un control y pueden suscribirse a los eventos provocados por los datos de entrada de Tablet PC. El subproceso en el que se producen estos eventos depende de si los eventos se provocan con un lápiz, un mouse o mediante programación. Para obtener más información sobre los subprocesos relacionados con estos eventos, vea General Threading Considerations y Threads on Which an Event Can Fire.

En la plataforma Windows Presentation Foundation, la clase UIElement tiene eventos para entradas manuscritas. Esto significa que cada control expone todos los eventos de lápiz óptico. Los eventos de lápiz óptico tienen pares de eventos de túnel y propagación y siempre se producen en el subproceso de la aplicación. Para obtener más información, vea Información general sobre eventos enrutados.

En el diagrama siguiente se comparan los modelos de objetos correspondientes a las clases que provocan eventos de lápiz óptico. El modelo de objetos de Windows Presentation Foundation muestra únicamente los eventos de propagación, no sus homólogos de túnel.

Diagrama de los eventos Stylus en WPF frente a formularios Windows Forms.

Datos del lápiz

Las tres plataformas proporcionan la manera de interceptar y manipular los datos procedentes de un lápiz de Tablet PC. En las plataformas COM y formularios Windows Forms, para lograr esto se crea un objeto RealTimeStylus, que se asocia a una ventana o control, y se crea una clase que implementa la interfaz IStylusSyncPlugin o IStylusAsyncPlugin. A continuación, se agrega el complemento personalizado a la colección de complementos de RealTimeStylus. Para obtener más información acerca de este modelo de objetos, vea Architecture of the StylusInput APIs.

En la plataforma WPF, la clase UIElement expone una colección de complementos, con un diseño similar a RealTimeStylus. Para interceptar los datos del lápiz, cree una clase que herede de StylusPlugIn y agregue el objeto a la colección StylusPlugIns de UIElement. Para obtener más información sobre esta interacción, vea Interceptar entradas del lápiz óptico.

En todas las plataformas, un grupo de subprocesos recibe los datos de entradas manuscritas a través de los eventos de lápiz óptico y los envía al subproceso de la aplicación. Para obtener más información sobre subprocesos en las plataformas COM y formularios Windows Forms, vea Threading Considerations for the StylusInput APIs. Para obtener más información sobre los subprocesos en el software de Windows Presentation Foundation, vea Modelo de subprocesamiento de entrada manuscrita.

En la ilustración siguiente se comparan los modelos de objetos de las clases que reciben los datos del lápiz en el grupo de subprocesos de lápiz.

Diagrama del modelo StylusPlugin en WPF frente a formularios Windows Forms.