Compartir a través de


Modelo de objetos de entrada de lápiz: COM y formularios Windows Forms frente a WPF

Básicamente hay tres plataformas compatibles con la entrada de lápiz digital: Tablet PC Windows Forms, Tablet PC COM y Windows Presentation Foundation (WPF). Las plataformas Windows Forms y COM comparten un modelo de objetos similar, pero el modelo de objetos para la plataforma WPF es sustancialmente diferente. En este tema se describen las diferencias generales para que los desarrolladores que han trabajado con un modelo de objetos puedan comprender mejor el otro.

Habilitación de la entrada de lápiz en una aplicación

Las tres plataformas incluyen objetos y controles que permiten que una aplicación reciba la entrada de un lápiz de tableta. Las plataformas Windows Forms y COM incluyen las clases Microsoft.Ink.InkPicture, Microsoft.Ink.InkEdit, Microsoft.Ink.InkOverlay y Microsoft.Ink.InkCollector. Microsoft.Ink.InkPicture and Microsoft.Ink.InkEdit son controles que se pueden agregar a una aplicación para recopilar la entrada de lápiz. Microsoft.Ink.InkOverlay y Microsoft.Ink.InkCollector se pueden adjuntar a una ventana existente para habilitar ventanas y controles personalizados compatibles con la entrada de lápiz.

La plataforma WPF incluye el control InkCanvas. Puede agregar un elemento InkCanvas a la aplicación y empezar a recopilar la entrada de lápiz inmediatamente. Con InkCanvas, el usuario puede copiar la entrada de lápiz, seleccionarla y cambiarla de tamaño. También puede agregar otros controles a InkCanvas y el usuario también puede escribir a mano sobre ellos. Puede crear un control personalizado habilitado para la entrada de lápiz si le agrega un elemento InkPresenter y recopila sus puntos de lápiz.

En la tabla siguiente se muestra dónde obtener más información sobre cómo habilitar la entrada de lápiz en una aplicación:

Para En la plataforma WPF… En las plataformas Windows Forms o COM…
Adición de un control habilitado para entrada de lápiz a una aplicación Vea Introducción a la entrada de lápiz. Vea Ejemplo de formulario de notificaciones automáticas
Habilitación de la entrada de lápiz en un control personalizado Vea Creación de un control de entrada de lápiz. Vea Ejemplo de Portapapeles de entrada de lápiz.

Datos de entrada de lápiz

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

En la plataforma WPF, la clase System.Windows.Ink.Stroke posee y administra su propia duración. Un grupo de objetos Stroke se puede recopilar en un objeto StrokeCollection, que proporciona métodos para operaciones comunes de administración de datos de entrada de lápiz, como pruebas de acceso, borrado, transformación y serialización de la entrada de lápiz. Un objeto Stroke puede pertenecer a cero, uno o varios objetos StrokeCollection en cualquier momento dado. En lugar de tener un objeto Microsoft.Ink.Ink, InkCanvas y InkPresenter contienen un objeto System.Windows.Ink.StrokeCollection.

En las dos ilustraciones siguientes se comparan los modelos de objetos de datos de entrada de lápiz. En las plataformas Windows Forms y COM, el objeto Microsoft.Ink.Ink restringe la duración de los objetos Microsoft.Ink.Stroke y los paquetes de lápiz 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.

Diagram of the Ink Object Model for COM/Winforms.Diagrama del modelo de objeto de entrada de lápiz digital para COM/WinForms.Ink_InkOwnsStrokes

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

Diagram of the Ink Object Model for WPF.Diagrama del modelo de objeto de entrada de lápiz digital para WPF.Ink_WPFInkObjectModel

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

Tarea Windows Presentation Foundation Windows Forms y COM
Guardar entrada de lápiz Save Microsoft.Ink.Ink.Save
Cargar entrada de lápiz Cree un objeto StrokeCollection con el constructor StrokeCollection. Microsoft.Ink.Ink.Load
Pruebas de acceso HitTest Microsoft.Ink.Ink.HitTest
Copiar entrada de lápiz CopySelection Microsoft.Ink.Ink.ClipboardCopy
Pegar entrada de lápiz Paste Microsoft.Ink.Ink.ClipboardPaste
Acceso a propiedades personalizadas en una colección de trazos AddPropertyData (las propiedades se almacenan internamente y se accede a ellas mediante AddPropertyData, RemovePropertyData y ContainsPropertyData) Usar Microsoft.Ink.Ink.ExtendedProperties

Compartir entrada de lápiz entre plataformas

Aunque las plataformas tienen diferentes modelos de objetos para los datos de entrada de lápiz, el uso compartido de los datos entre ellas es muy sencillo. En los ejemplos siguientes se guarda la entrada de lápiz de una aplicación de Windows Forms y se carga una aplicación de Windows Presentation Foundation.

using Microsoft.Ink;
using System.Drawing;
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>
MemoryStream SaveInkInWinforms(Ink inkToSave)
{
    byte[] savedInk = inkToSave.Save();

    return (new MemoryStream(savedInk));
}
'/ <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 System.Windows.Ink;
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 void LoadInkInWPF(MemoryStream inkStream)
{
    strokes = new StrokeCollection(inkStream);
}
'/ <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

En los ejemplos siguientes se guarda la entrada de lápiz de una aplicación de Windows Presentation Foundation y se carga en una aplicación de Windows Forms.

using System.Windows.Ink;
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>
MemoryStream SaveInkInWPF(StrokeCollection strokesToSave)
{
    MemoryStream savedInk = new MemoryStream();

    strokesToSave.Save(savedInk);

    return savedInk;
}
'/ <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 Microsoft.Ink;
using System.Drawing;
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 void LoadInkInWinforms(MemoryStream savedInk)
{
    theInk = new Ink();
    theInk.Load(savedInk.ToArray());
}
'/ <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

Eventos del lápiz para tableta

En las plataformas Windows Forms y COM, Microsoft.Ink.InkOverlay, Microsoft.Ink.InkCollector y Microsoft.Ink.InkPicture reciben eventos cuando el usuario introduce datos de lápiz. Microsoft.Ink.InkOverlay o Microsoft.Ink.InkCollector se adjunta a una ventana o a un control, y se pueden suscribir a los eventos generados por los datos de entrada de la tableta. El subproceso en el que se producen estos eventos depende de si los eventos se generan con un lápiz, un mouse o mediante programación. Para más información sobre el subproceso en relación con estos eventos, vea Consideraciones generales sobre subprocesos y Subprocesos en los que se puede desencadenar un evento.

En la plataforma Windows Presentation Foundation, la clase UIElement tiene eventos para la entrada de lápiz. Esto significa que cada control expone el conjunto completo de eventos de lápiz. Los eventos de lápiz tienen pares de eventos de tunelización o 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 muestran los modelos de objetos de las clases que generan eventos de lápiz. En el modelo de objetos de Windows Presentation Foundation solo se muestran los eventos de propagación, no los tunelización homólogos.

Diagram of the Stylus events in WPF vs Winforms.Diagrama de los eventos Stylus en WPF frente a WinForms.Ink_StylusEvents

Datos de lápiz

Las tres plataformas proporcionan formas de interceptar y manipular los datos que proceden de un lápiz para tableta. En las plataformas Windows Forms y COM, esto se logra mediante la creación de una instancia de Microsoft.StylusInput.RealTimeStylus al que se le adjunta una ventana o un control, y la creación de una clase que implemente la interfaz Microsoft.StylusInput.IStylusSyncPlugin o Microsoft.StylusInput.IStylusAsyncPlugin. Después, el complemento personalizado se agrega a la colección de Microsoft.StylusInput.RealTimeStylus. Para más información sobre este modelo de objetos, vea Arquitectura de las API StylusInput.

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

En todas las plataformas, un grupo de subprocesos recibe los datos de entrada de lápiz mediante eventos de lápiz y los envía al subproceso de la aplicación. Para más información sobre subprocesos en las plataformas COM y Windows, vea Consideraciones sobre subprocesos para las API StylusInput. Para más información sobre subprocesos en el software de presentación de Windows, vea El modelo de subprocesos de entrada de lápiz.

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

Diagram of the StylusPlugin model WPF vs Winforms.Diagrama del modelo StylusPlugin en WPF frente a WinForms.Ink_StylusPlugins