Partager via


Modèle objet encre : Windows Forms et COM ou WPF

Il existe essentiellement trois plateformes qui prennent en charge l’encre numérique : la plateforme Tablette 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 similaire, mais le modèle objet de la plateforme WPF est sensiblement différent. Cette rubrique décrit les différences à un niveau élevé afin que les développeurs qui ont travaillé avec un modèle objet puissent mieux comprendre l’autre.

Activation de l’entrée manuscrite dans une application

Les trois plateformes expédient des objets et des contrôles qui permettent à une application de recevoir une entrée à partir d’un stylet de tablette. Les plateformes Windows Forms et COM sont fournies avec les classes Microsoft.Ink.InkPicture, Microsoft.Ink.InkEdit, Microsoft.Ink.InkOverlay et Microsoft.Ink.InkCollector . Microsoft.Ink.InkPicture et Microsoft.Ink.InkEdit sont des contrôles que vous pouvez ajouter à une application pour collecter des entrées manuscrites. Microsoft.Ink.InkOverlay et Microsoft.Ink.InkCollector peuvent être attachés à une fenêtre existante pour activer des fenêtres manuscrites et des contrôles personnalisés.

La plateforme WPF inclut le InkCanvas contrôle. Vous pouvez ajouter un InkCanvas élément à votre application et commencer à collecter immédiatement des entrées manuscrites. Avec le InkCanvas, l’utilisateur peut copier, sélectionner et redimensionner l’encre. Vous pouvez également ajouter d’autres contrôles à l’utilisateur InkCanvas, et l’utilisateur peut également remplacer ces contrôles. Vous pouvez créer un contrôle personnalisé compatible avec l’entrée manuscrite en l’ajoutant InkPresenter et en collectant ses points de stylet.

Le tableau suivant répertorie où en savoir plus sur l’activation de l’entrée manuscrite dans une application :

Pour faire ceci... Sur la plateforme WPF... Sur les plateformes Windows Forms/COM...
Ajouter un contrôle avec entrée manuscrite à une application Consultez Prise en main de l’entrée manuscrite. Voir l’exemple de formulaire de revendications automatiques
Activer l’entrée manuscrite sur un contrôle personnalisé Voir Création d’un contrôle d’entrée manuscrite. Consultez l’exemple de Presse-papiers manuscrit.

Données manuscrites

Sur les plateformes Windows Forms et COM, Microsoft.Ink.InkCollector, Microsoft.Ink.InkOverlay, Microsoft.Ink.InkEdit et Microsoft.Ink.InkPicture exposent chacun un objet Microsoft.Ink.Ink.Ink . L’objet Microsoft.Ink.Ink contient les données d’un ou plusieurs objets Microsoft.Ink.Stroke et expose les méthodes et propriétés courantes pour gérer et manipuler ces traits. L’objet Microsoft.Ink.Ink gère la durée de vie des traits qu’il contient ; l’objet Microsoft.Ink.Ink crée et supprime les traits qu’il possède. Chaque Microsoft.Ink.Stroke a un identificateur unique au sein de son objet Parent Microsoft.Ink.Ink .

Sur la plateforme WPF, la System.Windows.Ink.Stroke classe possède et gère sa propre durée de vie. Un groupe d’objets Stroke peut être collecté ensemble dans un StrokeCollection, qui fournit des méthodes pour les opérations courantes de gestion des données manuscrites, telles que les tests d’accès, l’effacement, la transformation et la sérialisation de l’encre. Un Stroke peut appartenir à zéro, un ou plusieurs StrokeCollection objets à tout moment. Au lieu d’avoir un objet Microsoft.Ink.Ink , le InkCanvas et InkPresenter contenir un System.Windows.Ink.StrokeCollection.

La paire d’illustrations suivante compare les modèles objet de données manuscrites. Sur les plateformes Windows Forms et COM, l’objet Microsoft.Ink.Ink limite la durée de vie des objets Microsoft.Ink.Stroke et les paquets de stylet appartiennent aux traits individuels. Deux traits ou plus peuvent référencer le même objet Microsoft.Ink.DrawingAttributes , comme illustré dans l’illustration suivante.

Diagram of the Ink Object Model for COM/Winforms.

Sur WPF, chacun System.Windows.Ink.Stroke est un objet Common Language Runtime qui existe tant que quelque chose a une référence à celui-ci. Chaque Stroke référence un objet et System.Windows.Ink.DrawingAttributes un StylusPointCollection objet, qui sont également des objets Common Language Runtime.

Diagram of the Ink Object Model for WPF.

Le tableau suivant compare comment effectuer certaines 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’entrée manuscrite Save Microsoft.Ink.Ink.Save
Charger l’entrée manuscrite Créez un StrokeCollection composant avec le StrokeCollection constructeur. Microsoft.Ink.Ink.Load
Test de positionnement HitTest Microsoft.Ink.Ink.HitTest
Copier l’entrée manuscrite CopySelection Microsoft.Ink.Ink.Presse-papiersCopy
Coller l’encre Paste Microsoft.Ink.Ink.Presse-papiersPaste
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, RemovePropertyDataet ContainsPropertyData) Utiliser Microsoft.Ink.Ink.ExtendedProperties

Partage d’entrées manuscrites entre plateformes

Bien que les plateformes aient différents modèles objet pour les données manuscrites, le partage des données entre les plateformes est très facile. Les exemples suivants enregistrent des entrées manuscrites à partir d’une application Windows Forms et chargent l’entrée manuscrite dans une application 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

Les exemples suivants enregistrent les entrées manuscrites à partir d’une application Windows Presentation Foundation et chargent l’entrée manuscrite dans une application 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

Événements à partir du stylet Tablette

Microsoft.Ink.InkOverlay, Microsoft.Ink.InkCollector et Microsoft.Ink.InkPicture sur les plateformes Windows Forms et COM reçoivent des événements lorsque l’utilisateur entre des données de stylet. Microsoft.Ink.InkOverlay ou Microsoft.Ink.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 par programmation. Pour plus d’informations sur le threading par rapport à ces événements, consultez Considérations générales relatives aux threads et threads sur lesquels un événement peut se déclencher.

Sur la plateforme Windows Presentation Foundation, la UIElement classe a des événements pour l’entrée de stylet. Cela signifie que chaque contrôle expose l’ensemble complet d’événements de stylet. Les événements de stylet ont des paires d’événements tunneling/bubbling et se produisent toujours sur le thread d’application. Pour plus d’informations, consultez Vue d’ensemble des événements acheminés.

Le diagramme suivant montre comment comparer 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 bubbling, et non les équivalents d’événements de tunneling.

Diagram of the Stylus events in WPF vs Winforms.

Données de stylet

Les trois plateformes vous offrent des moyens d’intercepter et de manipuler les données provenant d’un stylet tablette. Sur les plateformes Windows Forms et COM, cela est réalisé en créant un Microsoft.StylusInput.RealTimeStylus, en lui attachant une fenêtre ou un contrôle, et en créant une classe qui implémente l’interface Microsoft.StylusInput.IStylusSyncPlugin ou Microsoft.StylusInput.IStylusAsyncPlugin . Le plug-in personnalisé est ensuite ajouté à la collection de plug-ins de Microsoft.StylusInput.RealTimeStylus. Pour plus d’informations sur ce modèle objet, consultez Architecture des API StylusInput.

Sur la plateforme WPF, la UIElement classe expose une collection de plug-ins, similaire à la conception de Microsoft.StylusInput.RealTimeStylus. Pour intercepter des données de stylet, créez une classe qui hérite et StylusPlugIn ajoutez l’objet à la StylusPlugIns collection du UIElement. Pour plus d’informations sur cette interaction, consultez Intercepting Input from the Stylus.

Sur toutes les plateformes, un pool de threads reçoit les données manuscrites via des événements de stylet et les envoie au thread d’application. Pour plus d’informations sur le thread sur les plateformes COM et Windows, consultez Considérations relatives au thread pour les API StylusInput. Pour plus d’informations sur le threading sur le logiciel de présentation Windows, consultez le modèle de thread d’encre.

L’illustration suivante compare les modèles objet pour les classes qui reçoivent des données de stylet sur le pool de threads de stylet.

Diagram of the StylusPlugin model WPF vs Winforms.