Delen via


Voorbeeld van RealTimeStylus-invoegtoepassing

Deze toepassing laat zien hoe u werkt met de klasse RealTimeStylus. Zie Toegang tot en manipulatie van StylusInputvoor een gedetailleerd overzicht van de StylusInput-API's, waaronder de RealTimeStylus. Zie Plug-ins en de RealTimeStylus-klassevoor informatie over synchrone en asynchrone invoegtoepassingen.

Overzicht van het voorbeeld

Invoegtoepassingen, objecten die de IStylusSyncPlugin of IStylusAsyncPlugin interface implementeren, kunnen worden toegevoegd aan een RealTimeStylus--object. In deze voorbeeldtoepassing worden verschillende typen invoegtoepassingen gebruikt:

  • Pakketfilterplug-in: wijzigt pakketten. De pakketfilterinvoegtoepassing in dit voorbeeld wijzigt pakketgegevens door alle pakketgegevens (x,y) binnen een rechthoekig gebied te beperken.
  • Aangepaste plug-in voor dynamische renderer: past dynamische renderingkwaliteiten aan. De aangepaste invoegtoepassing voor dynamische rendering in dit voorbeeld wijzigt de manier waarop inkt wordt weergegeven door een kleine cirkel rond elk punt (x,y) te tekenen op een pennenstreek.
  • Dynamische Render-invoegtoepassing: wijzigt dynamische weergave-eigenschappen. In dit voorbeeld ziet u hoe u het DynamicRenderer--object gebruikt als een invoegtoepassing om dynamische rendering van inkt te verwerken.
  • Gesture Recognizer-invoegtoepassing: hiermee worden toepassingsbewegingen herkend. In dit voorbeeld wordt het gebruik van het GestureRecognizer--object gedemonstreert als een invoegtoepassing om toepassingsbewegingen te herkennen (wanneer deze wordt uitgevoerd op een systeem met de microsoft-gebarenherkenning).

Daarnaast biedt dit voorbeeld een gebruikersinterface waarmee de gebruiker de volgorde van elke invoegtoepassing in de verzameling kan toevoegen, verwijderen en wijzigen. De voorbeeldoplossing bevat twee projecten, RealTimeStylusPluginApp en RealTimeStylusPlugins. RealTimeStylusPluginApp bevat de gebruikersinterface voor het voorbeeld. RealTimeStylusPlugins bevat de implementaties van de invoegtoepassingen. Het project RealTimeStylusPlugins definieert de Naamruimte RealTimeStylusPlugins, die het pakketfilter en de aangepaste dynamische rendererinvoegtoepassingen bevat. Naar deze naamruimte wordt verwezen door het project RealTimeStylusPluginApp. Het project RealTimeStylusPlugins maakt gebruik van de Microsoft.Ink, Microsoft.StylusInputen Microsoft.StylusInput.PluginData naamruimten.

Zie voor een overzicht van de Microsoft.StylusInput en Microsoft.StylusInput.PluginData naamruimten Architectuur van de StylusInput-API's.

Pakketfilterinvoegtoepassing

De invoegtoepassing voor pakketfilters is een synchrone invoegtoepassing die de pakketwijziging demonstreert. In het bijzonder definieert het een rechthoek op het formulier. Pakketten die buiten de regio worden geplaatst, worden binnen de regio getoond. De invoegtoepassingsklasse, PacketFilterPlugin, registreert zich voor meldingen van StylusDown, StylusUpen Packets peninvoergebeurtenissen. De klasse implementeert de StylusDown, StylusUpen Packets methoden die zijn gedefinieerd op de IStylusSyncPlugin klasse.

De openbare constructor voor PacketFilterPlugin vereist een structuur van het type Rectangle. Deze rechthoek definieert het rechthoekige gebied, in inktruimtecoördinaten (.01mm = 1 HIMETRIC-eenheid), waarin pakketten worden opgenomen. De rechthoek wordt bewaard in een privéveld, rectangle.

public class PacketFilterPlugin:IStylusSyncPlugin  
{
    private System.Drawing.Rectangle rectangle = System.Drawing.Rectangle.Empty;
    public PacketFilterPlugin(Rectangle r)
    {
        rectangle = r;
    }
    // ...

De PacketFilterPlugin-klasse registreert zich voor gebeurtenismeldingen door de get accessor te implementeren voor de eigenschap DataInterest. In dit geval wil de invoegtoepassing reageren op de StylusDown, Packets, StylusUpen Error meldingen. Het voorbeeld retourneert deze waarden zoals gedefinieerd in de opsomming DataInterestMask. De StylusDown methode wordt aangeroepen wanneer de pentip het digitaliserende oppervlak contacteert. De StylusUp methode wordt aangeroepen wanneer de pentip het digitaliserende oppervlak verlaat. De methode Packets wordt aangeroepen wanneer het RealTimeStylus-object pakketten ontvangt. De methode Error wordt aangeroepen wanneer de huidige invoegtoepassing of een eerdere invoegtoepassing een uitzondering genereert.

public DataInterestMask DataInterest
{
    get
    {
        return DataInterestMask.StylusDown | 
               DataInterestMask.Packets | 
               DataInterestMask.StylusUp | 
               DataInterestMask.Error;
    }
}           
    //...

De PacketFilterPlugin klasse verwerkt de meeste van deze meldingen in een helpermethode, ModifyPacketData. De methode ModifyPacketData haalt de x- en y-waarden voor elk nieuw pakket op uit de klasse PacketsData. Als een van beide waarden zich buiten de rechthoek bevindt, vervangt de methode de waarde door het dichtstbijzijnde punt dat nog steeds binnen de rechthoek valt. Dit is een voorbeeld van hoe een invoegtoepassing pakketgegevens kan vervangen als deze worden ontvangen van de peninvoerstroom.

private void ModifyPacketData(StylusDataBase data)
{
    for (int i = 0; i < data.Count ; i += data.PacketPropertyCount)
    {
        // packet data always has x followed by y followed by the rest
        int x = data[i];
        int y = data[i+1];

        // Constrain points to the input rectangle
        x = Math.Max(x, rectangle.Left);
        x = Math.Min(x, rectangle.Right);
        y = Math.Max(y, rectangle.Top);
        y = Math.Min(y, rectangle.Bottom);

        // If necessary, modify the x,y packet data
        if (x != data[i])
        {
            data[i] = x;
        }
        if (y != data[i+1])
        {
            data[i+1] = y;
        } 
    }
}

Aangepaste invoegtoepassing voor dynamische renderer

De CustomDynamicRenderer klasse implementeert ook de klasse IStylusSyncPlugin om meldingen voor peninvoer te ontvangen. Vervolgens wordt de Packets melding verwerkt om een kleine cirkel rond elk nieuw pakketpunt te tekenen.

De klasse bevat een Graphics variabele die een verwijzing bevat naar het grafische object dat is doorgegeven aan de klasseconstructor. Dit is het grafische object dat wordt gebruikt voor dynamische rendering.

private Graphics myGraphics;

public CustomDynamicRendererPlugin(Graphics g)
{
    myGraphics = g;
}
        //...
            

Wanneer de aangepaste dynamische renderer plug-in een pakketmelding ontvangt, extraheert het de (x,y) gegevens en tekent het een kleine groene cirkel rond het punt. Dit is een voorbeeld van aangepaste rendering op basis van de peninvoerstroom.

public void Packets(RealTimeStylus sender,  PacketsData data)
{           
    for (int i = 0; i < data.Count; i += data.PacketPropertyCount)
    {
        // Packet data always has x followed by y followed by the rest
        Point point = new Point(data[i], data[i+1]);

        // Since the packet data is in Ink Space coordinates, we need to convert to Pixels...
        point.X = (int)Math.Round((float)point.X * (float)myGraphics.DpiX/2540.0F);
        point.Y = (int)Math.Round((float)point.Y * (float)myGraphics.DpiY/2540.0F);

        // Draw a circle corresponding to the packet
        myGraphics.DrawEllipse(Pens.Green, point.X - 2, point.Y - 2, 4, 4);
    }
}

Het project RealTimeStylusPluginApp

Het project RealTimeStylusPluginApp demonstreert de eerder beschreven invoegtoepassingen, evenals de GestureRecognizer en DynamicRenderer plug-ins. De gebruikersinterface van het project bestaat uit:

  • Een formulier met een GroupBox control die wordt gebruikt om het invoergebied voor inkt te definiëren.
  • Een CheckedListBox controle om een lijst weer te geven en de beschikbare plug-ins te selecteren.
  • Een paar Knopobjecten om de invoegtoepassingen opnieuw te ordenen.

Het project definieert een structuur, PlugInListItem, om het beheer van de invoegtoepassingen die in het project worden gebruikt eenvoudiger te maken. De PlugInListItem structuur bevat de invoegtoepassing en een beschrijving.

De klasse RealTimeStylusPluginApp zelf implementeert de klasse IStylusAsyncPlugin. Dit is nodig zodat de RealTimeStylusPluginApp-klasse kan worden gewaarschuwd wanneer de GestureRecognizer invoegtoepassing bewegingsgegevens toevoegt aan de uitvoerwachtrij. De toepassing registreert zich voor de melding van CustomStylusDataAdded. Wanneer gebaargegevens worden ontvangen, plaatst RealTimeStylusPluginApp er een beschrijving van op de statusbalk onder aan het formulier.

public void CustomStylusDataAdded(RealTimeStylus sender, CustomStylusData data)
{
    if (data.CustomDataId == GestureRecognizer.GestureRecognitionDataGuid)
    {
        GestureRecognitionData grd = data.Data as GestureRecognitionData;
        if (grd != null)
        {
            if (grd.Count > 0)
            {
                GestureAlternate ga = grd[0];
                sbGesture.Text = "Gesture=" + ga.Id + ", Confidence=" + ga.Confidence;
            }
        }
    }
}

Notitie

In de CustomStylusDataAdded-implementatie is het interessant om te zien dat je de aangepaste bewegingsgegevens in de uitvoerwachtrij kunt identificeren via GUID (met behulp van het veld GestureRecognitionDataGuid) of op basis van type (door het gebruik van het resultaat van de 'as'-instructie). In het voorbeeld worden beide identificatietechnieken gebruikt voor demonstratiedoeleinden. Beide benaderingen zijn ook geldig.

 

In de 'Laden'-gebeurtenisbehandelaar van het formulier maakt de toepassing exemplaren van de klassen PacketFilter en CustomDynamicRenderer en voegt deze toe aan het lijstvak. De toepassing probeert vervolgens een exemplaar van de GestureRecognizer klasse te maken en, indien geslaagd, voegt deze toe aan de keuzelijst. Dit mislukt als de gebarenherkenning niet aanwezig is op het systeem. Vervolgens maakt de toepassing een instantie van een DynamicRenderer--object en voegt deze toe aan het lijstvak. Ten slotte maakt de toepassing elk van de invoegtoepassingen en het RealTimeStylus object zelf mogelijk.

Een ander belangrijk punt om te weten over het voorbeeld is dat in de helpermethoden het RealTimeStylus-object eerst wordt uitgeschakeld voordat invoegtoepassingen worden toegevoegd of verwijderd en vervolgens opnieuw zijn ingeschakeld nadat de toevoeging of verwijdering is voltooid.

private void RemoveFromPluginCollection(int index)
{
    IStylusSyncPlugin plugin = ((PluginListItem)chklbPlugins.Items[index]).Plugin;

    bool rtsEnabled = myRealTimeStylus.Enabled;
    myRealTimeStylus.Enabled = false;
    myRealTimeStylus.SyncPluginCollection.Remove(plugin);
    myRealTimeStylus.Enabled = rtsEnabled;
}

Microsoft.StylusInput.DynamicRenderer

Microsoft.StylusInput.GestureRecognizer

Microsoft.StylusInput.RealTimeStylus

Microsoft.StylusInput.DataInterestMask

Microsoft.StylusInput.IStylusSyncPlugin

Microsoft.StylusInput.IStylusAsyncPlugin

Microsoft.StylusInput.PluginData.PacketsData

stylusinvoer openen en bewerken

nl-NL: Plug-ins en de RealTimeStylus Klasse

RealTimeStylus Ink Collectie Voorbeeld