Modèle objet encre : Windows Forms et COM ou WPF
Mise à jour : novembre 2007
Il existe essentiellement trois plateformes qui prennent en charge l'encre numérique : la plateforme Tablet PC Windows Forms, la plateforme Tablet PC COM et la plateforme Windows Presentation Foundation (WPF). Les plateformes Windows Forms et COM partagent un modèle objet semblable, mais le modèle objet de la plateforme WPF est relativement différent. Cette rubrique étudie les différences à un haut niveau pour que les développeurs qui ont travaillé avec un modèle objet puissent mieux comprendre les autres.
Activation d'encre dans une application
Les trois plateformes fournissent des objets et des contrôles qui permettent à une application de recevoir l'entrée d'un stylet. Les plateformes Windows Forms et COM sont fournies avec les classes InkPicture, InkEdit, InkOverlay et InkCollector. InkPicture et InkEdit sont des contrôles que vous pouvez ajouter à une application pour collecter l'encre. InkOverlay et InkCollector peuvent être attachés à une fenêtre existante pour permettre aux fenêtres et aux contrôles personnalisés de prendre en charge l'écriture manuscrite.
La plateforme WPF inclut le contrôle InkCanvas. Vous pouvez ajouter un InkCanvas à votre application et commencer à collecter l'encre immédiatement. Avec le InkCanvas, l'utilisateur peut copier, sélectionner et redimensionner l'encre. Vous pouvez ajouter d'autres contrôles au InkCanvas et l'utilisateur peut écrire à la main sur ces contrôles. Vous pouvez créer un contrôle personnalisé prenant en charge l'écriture manuscrite en lui ajoutant un InkPresenter et en collectant ses points de stylet.
Le tableau suivant indique comment en apprendre davantage sur l'activation de l'encre dans une application :
Pour… |
Sur la plateforme WPF... |
Sur les plateformes Windows Forms/COM… |
---|---|---|
Ajouter un contrôle prenant en charge l'écriture manuscrite à une application |
Consultez Débuter avec l'encre. |
Consultez Auto Claims Form Sample |
Activer l'encre sur un contrôle personnalisé |
Consultez Création d'un contrôle d'entrée d'encre. |
Consultez Ink Clipboard Sample. |
Données de l'encre
Sur les plateformes Windows Forms et COM, InkCollector, InkOverlay, InkEdit et InkPicture exposent chacun un objet Microsoft.Ink.Ink. L'objet Ink contient les données pour un ou plusieurs objets Microsoft.Ink.Stroke et expose des méthodes et des propriétés communes pour gérer et manipuler ces traits. L'objet Ink gère la durée de vie des traits qu'il contient ; l'objet Ink crée et supprime les traits qu'il possède. Chaque Stroke a un identificateur qui est unique dans son objet Ink parent.
Sur la plateforme WPF, la classe System.Windows.Ink.Stroke possède et gère sa propre durée de vie. Un groupe d'objets Stroke peut être collecté dans un StrokeCollection qui fournit des méthodes pour les opérations de gestion des données de l'encre communes telles que le test d'atteinte, l'effacement, la transformation et la sérialisation de l'encre. Un Stroke peut appartenir à aucun, un ou plusieurs objets StrokeCollection à un moment donné. Au lieu d'avoir un objet Microsoft.Ink.Ink, InkCanvas et InkPresenter contiennent un System.Windows.Ink.StrokeCollection.
Les illustrations suivantes comparent les modèles objet des données de l'encre.Sur les plateformes Windows Forms et COM, l'objet Microsoft.Ink.Ink contraint la durée de vie des objets Microsoft.Ink.Stroke, et les paquets de stylet appartiennent aux traits individuels. Deux ou plusieurs traits peuvent référencer le même objet Microsoft.Ink.DrawingAttributes, comme indiqué dans l'illustration suivante.
Sur WPF, chaque System.Windows.Ink.Stroke est un objet Common Language Runtime qui existe tant que quelque chose lui est référencé. Chaque Stroke référence des objets StylusPointCollection et System.Windows.Ink.DrawingAttributes qui sont également des objets Common Language Runtime.
Le tableau suivant compare l'exécution des tâches courantes sur la plateforme WPF et les plateformes Windows Forms et COM.
Tâche |
Windows Presentation Foundation |
Windows Forms et COM |
---|---|---|
Enregistrer l'encre |
||
Charger l'encre |
Créer un StrokeCollection avec le constructeur StrokeCollection.StrokeCollection(Stream). |
|
Test d'atteinte |
||
Copier l'encre |
||
Coller l'encre |
||
Accéder aux propriétés personnalisées sur une collection de traits |
AddPropertyData (les propriétés sont stockées en interne et accessibles via AddPropertyData, RemovePropertyData et ContainsPropertyData) |
Utiliser ExtendedProperties |
Partage d'encre entre les plateformes
Bien que les plateformes aient des modèles objet différents pour les données de l'encre, le partage des données entre les plateformes est très facile. Les exemples suivants enregistrent l'encre d'une application Windows Forms et chargent l'encre dans une application 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);
}
Les exemples suivants enregistrent l'encre d'une application Windows Presentation Foundation et chargent l'encre dans une application 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());
}
Événements du stylet
InkOverlay, InkCollector et InkPicture, sur les plateformes Windows Forms et COM, reçoivent des événements lorsque l'utilisateur entre les données du stylet. InkOverlay ou InkCollector est attaché à une fenêtre ou à un contrôle et peut s'abonner aux événements déclenchés par les données d'entrée de tablette. Le thread sur lequel ces événements se produisent varie selon que les événements sont déclenchés avec un stylet, une souris ou un programme. Pour plus d'informations sur les threads liés à ces événements, consultez General Threading Considerations et Threads on Which an Event Can Fire.
Sur la plateforme Windows Presentation Foundation, la classe UIElement dispose d'événements pour la saisie effectuée à l'aide du stylet. Cela signifie que chaque contrôle expose le jeu complet d'événements de stylet.Les événements de stylet ont des paires d'événements de tunneling/propagation et se produisent toujours sur le thread d'application. Pour plus d'informations, consultez Vue d'ensemble des événements routés.
Le diagramme suivant compare les modèles objet pour les classes qui déclenchent des événements de stylet. Le modèle objet Windows Presentation Foundation affiche uniquement les événements de propagation, pas les équivalents d'événements de tunneling.
Données de stylet
Les trois plateformes fournissent des méthodes pour intercepter et manipuler les données issues d'un stylet. Sur les plateformes Windows Forms et COM, il convient de créer un RealTimeStylus, d'y attacher une fenêtre ou un contrôle et de créer une classe qui implémente l'interface IStylusSyncPlugin ou IStylusAsyncPlugin. Puis, le plug-in personnalisé est ajouté à la collection de plug-in du RealTimeStylus. Pour plus d'informations sur ce modèle objet, consultez Architecture of the StylusInput APIs.
Sur la plateforme WPF, la classe UIElement expose une collection de plug-in, dont la conception est semblable au RealTimeStylus. Pour intercepter les données de stylet, créez une classe qui hérite de StylusPlugIn et ajoutez l'objet à la collection StylusPlugIns du UIElement. Pour plus d'informations sur cette interaction, consultez Interception d'entrée à partir du stylet.
Sur toutes les plateformes, un pool de threads reçoit les données de l'encre via des événements de stylet et les envoie au thread d'application. Pour plus d'informations concernant les threads sur les plateformes COM et Windows, consultez Threading Considerations for the StylusInput APIs. Pour plus d'informations concernant les threads sur Windows Presentation Software, consultez Modèle de thread de l'encre.
L'illustration suivante compare les modèles objet pour les classes qui reçoivent les données de stylet sur le pool de threads de stylet.