Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Básicamente hay tres plataformas que admiten la entrada de lápiz digital: la plataforma de Windows Forms de Tablet PC, la plataforma COM de Tablet PC y la plataforma de Windows Presentation Foundation (WPF). Las plataformas Windows Forms y COM comparten un modelo de objetos similar, pero el modelo de objetos de la plataforma WPF es sustancialmente diferente. En este tema se describen las diferencias de alto nivel para que los desarrolladores que han trabajado con un modelo de objetos puedan comprender mejor el otro.
Habilitación de tinta digital en una aplicación
Las tres plataformas envían objetos y controles que permiten a una aplicación recibir la entrada de un lápiz de tableta. Las plataformas Windows Forms y COM se incluyen con las clases Microsoft.Ink.InkPicture, Microsoft.Ink.InkEdit, Microsoft.Ink.InkOverlay y Microsoft.Ink.InkCollector . Microsoft.Ink.InkPicture y Microsoft.Ink.InkEdit son controles que puede agregar a una aplicación para recopilar entradas de lápiz. Microsoft.Ink.InkOverlay y Microsoft.Ink.InkCollector se pueden adjuntar a una ventana existente para habilitar las ventanas y los controles personalizados.
La plataforma WPF incluye el InkCanvas control . Puede agregar un elemento InkCanvas a la aplicación y empezar a recopilar la entrada de lápiz inmediatamente. InkCanvas, el usuario puede copiar, seleccionar y cambiar el tamaño de la tinta. También puede agregar otros controles a InkCanvas, y el usuario puede escribir sobre esos controles. Puede crear un control personalizado habilitado para el uso de lápiz táctil agregando un elemento InkPresenter y recopilando sus puntos de lápiz táctil.
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/COM... |
---|---|---|
Agregar un control habilitado para tinta a una aplicación | Consulte Primeros pasos con Ink. | Consulte Ejemplo de formulario de notificaciones automáticas |
Habilitar la entrada de lápiz en un control personalizado | Consulte Creación de un control de entrada de lápiz. | Vea Ejemplo de Portapapeles de tinta. |
Datos 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 Microsoft.Ink.Stroke tiene un identificador único dentro de su objeto primario Microsoft.Ink.Ink .
En la plataforma WPF, la clase System.Windows.Ink.Stroke posee y administra su propio ciclo de vida. Un grupo de Stroke objetos se puede recopilar juntos en StrokeCollection, que proporciona métodos para operaciones comunes de administración de datos de tinta, como pruebas de impacto, borrado, transformación y serialización de la tinta. Un Stroke puede pertenecer a cero, uno o varios StrokeCollection objetos en cualquier momento dado. En lugar de tener un objeto Microsoft.Ink.Ink, InkCanvas y InkPresenter contienen un System.Windows.Ink.StrokeCollection.
El siguiente par de ilustraciones compara los modelos de objetos de datos de tinta. En las plataformas Windows Forms y COM, el objeto Microsoft.Ink.Ink limita la vida útil de los objetos Microsoft.Ink.Stroke, y los paquetes del 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.
En WPF, cada uno System.Windows.Ink.Stroke es un objeto de Common Language Runtime que existe siempre que algo tenga una referencia a él. Cada Stroke hace referencia a un objeto StylusPointCollection y System.Windows.Ink.DrawingAttributes, todos ellos son objetos de Common Language Runtime.
En la tabla siguiente se compara cómo realizar algunas tareas comunes en la plataforma WPF y en las plataformas Windows Forms y COM.
Tarea | Windows Presentation Foundation | Formularios Windows Forms y COM |
---|---|---|
Ahorrar tinta | Save | Microsoft.Ink.Ink.Save |
Cargar tinta | Cree un StrokeCollection con el constructor StrokeCollection. | Microsoft.Ink.Ink.Load |
Prueba de detección de colisiones | HitTest | Microsoft.Ink.Ink.HitTest |
Copiar tinta | CopySelection | Microsoft.Ink.Ink.ClipboardCopy |
Pegar tinta | 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 a través AddPropertyDatade , RemovePropertyDatay ContainsPropertyData) | Usar Microsoft.Ink.Ink.ExtendedProperties |
Uso compartido de tinta entre plataformas
Aunque las plataformas tienen diferentes modelos de objetos para los datos de entrada de lápiz, compartir los datos entre las plataformas es muy fácil. En los siguientes ejemplos, se guarda la tinta de una aplicación de Windows Forms y se carga la tinta en 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 siguientes ejemplos, se guarda la tinta digital de una aplicación de Windows Presentation Foundation y se carga la tinta digital 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 desde el lápiz de tableta
Microsoft.Ink.InkOverlay, Microsoft.Ink.InkCollector y Microsoft.Ink.InkPicture en las plataformas Windows Forms y COM reciben eventos cuando el usuario introduce los datos del lápiz. Microsoft.Ink.InkOverlay o Microsoft.Ink.InkCollector está asociado a una ventana o a un control, y puede suscribirse a los eventos generados por los datos de entrada de la tableta. El hilo 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 obtener 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 óptico. Los eventos de lápiz óptico 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, consulte Información general sobre eventos enrutados.
En el diagrama siguiente se muestran las comparaciones de los modelos de objetos de las clases que generan eventos de lápiz óptico. El modelo de objetos de Windows Presentation Foundation muestra solo los eventos de propagación, no los homólogos del evento de tunelización.
Datos de lápiz digital
Las tres plataformas proporcionan formas de interceptar y manipular los datos que proceden de un lápiz de tableta. En las plataformas Windows Forms y COM, esto se logra creando un Microsoft.StylusInput.RealTimeStylus, adjuntando una ventana o control a ella, y creando una clase que implemente la interfaz Microsoft.StylusInput.IStylusSyncPlugin o Microsoft.StylusInput.IStylusAsyncPlugin . A continuación, el complemento personalizado se agrega a la colección de complementos de Microsoft.StylusInput.RealTimeStylus. Para obtener más información sobre este modelo de objetos, consulte Arquitectura de las API stylusInput.
En la plataforma WPF, la UIElement clase expone una colección de complementos, similar al diseño de Microsoft.StylusInput.RealTimeStylus. Para interceptar los datos del lápiz, cree una clase que herede de StylusPlugIn y agregue el objeto a la StylusPlugIns colección de UIElement. Para obtener más información sobre esta interacción, vea Intercepting Input from the Stylus(Intercepting Input from the Stylus).
En todas las plataformas, un grupo de subprocesos recibe los datos de tinta a través de eventos de lápiz y los envía al subproceso de la aplicación. Para obtener más información sobre el subproceso en las plataformas COM y Windows, consulte Consideraciones sobre subprocesos para las API StylusInput. Para obtener más información sobre el subproceso 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.
.NET Desktop feedback