スタイラスからの入力のインターセプトIntercepting Input from the Stylus

System.Windows.Input.StylusPlugInsアーキテクチャに低レベルの制御を実装するためのメカニズムを提供するStylus入力およびデジタル インクの作成Strokeオブジェクト。The System.Windows.Input.StylusPlugIns architecture provides a mechanism for implementing low-level control over Stylus input and the creation of digital ink Stroke objects. StylusPlugInクラスがカスタム動作を実装し、最適なパフォーマンスのスタイラス デバイスからのデータのストリームに適用するためのメカニズムを提供します。The StylusPlugIn class provides a mechanism for you to implement custom behavior and apply it to the stream of data coming from the stylus device for the optimal performance.

このトピックは、次の内容で構成されています。This topic contains the following subsections:

アーキテクチャArchitecture

StylusPlugInの進化には、 StylusInputで説明されている Apiへのアクセスおよび操作するペン入力Microsoft Windows XP Tablet PC Edition のソフトウェアDevelopment Kit 1.7します。The StylusPlugIn is the evolution of the StylusInput APIs, described in Accessing and Manipulating Pen Input, in the Microsoft Windows XP Tablet PC Edition Software Development Kit 1.7.

UIElementが、StylusPlugInsプロパティが、StylusPlugInCollectionします。Each UIElement has a StylusPlugIns property that is a StylusPlugInCollection. 追加することができます、StylusPlugIn要素のStylusPlugInsプロパティを操作するStylusPointデータが生成されます。You can add a StylusPlugIn to an element's StylusPlugIns property to manipulate StylusPoint data as it is generated. StylusPoint データを含む、システムのデジタイザーでサポートされるすべてのプロパティから成る、XY、データ ポイントだけでなくPressureFactorデータ。StylusPoint data consists of all the properties supported by the system digitizer, including the X and Y point data, as well as PressureFactor data.

StylusPlugInオブジェクトからのデータのストリームに直接挿入、Stylusデバイスを追加すると、StylusPlugInStylusPlugInsプロパティ。Your StylusPlugIn objects are inserted directly into the stream of data coming from the Stylus device when you add the StylusPlugIn to the StylusPlugIns property. プラグインを追加する順序、StylusPlugInsコレクションが表示される順序を決定するStylusPointデータ。The order in which plug-ins are added to the StylusPlugIns collection dictates the order in which they will receive StylusPoint data. など、特定のリージョンへの入力を制限するフィルター プラグインを追加してデータを書き込むときに、ジェスチャを認識するプラグインを追加し、ジェスチャを認識するプラグインは受信フィルター選択されたStylusPointデータ。For example, if you add a filter plug-in that restricts input to a particular region, and then add a plug-in that recognizes gestures as they are written, the plug-in that recognizes gestures will receive filtered StylusPoint data.

スタイラス プラグインを実装します。Implementing Stylus Plug-ins

プラグインを実装する派生クラスをStylusPlugInします。To implement a plug-in, derive a class from StylusPlugIn. このクラスはデータのストリームからなる、Stylusします。This class is applied o the stream of data as it comes in from the Stylus. このクラスでは、値を変更することができます、StylusPointデータ。In this class you can modify the values of the StylusPoint data.

注意事項

場合、StylusPlugInをスローするか閉じて、アプリケーションは、例外が発生します。If a StylusPlugIn throws or causes an exception, the application will close. 使用するコントロールを十分にテストする必要があります、StylusPlugInのみがわかっている場合に、コントロールを使用して、StylusPlugIn例外はスローされません。You should thoroughly test controls that consume a StylusPlugIn and only use a control if you are certain the StylusPlugIn will not throw an exception.

次の例で変更することで、スタイラスからの入力を制限するプラグイン、XY値、StylusPointからデータを受信、Stylusデバイス。The following example demonstrates a plug-in that restricts the stylus input by modifying the X and Y values in the StylusPoint data as it comes in from the Stylus device.

using System;
using System.Windows.Media;
using System.Windows;
using System.Windows.Input.StylusPlugIns;
using System.Windows.Input;
using System.Windows.Ink;
Imports System
Imports System.Windows.Media
Imports System.Windows
Imports System.Windows.Input.StylusPlugIns
Imports System.Windows.Input
Imports System.Windows.Ink
// A StylusPlugin that restricts the input area.
class FilterPlugin : StylusPlugIn
{
    protected override void OnStylusDown(RawStylusInput rawStylusInput)
    {
        // Call the base class before modifying the data.
        base.OnStylusDown(rawStylusInput);

        // Restrict the stylus input.
        Filter(rawStylusInput);
    }

    protected override void OnStylusMove(RawStylusInput rawStylusInput)
    {
        // Call the base class before modifying the data.
        base.OnStylusMove(rawStylusInput);

        // Restrict the stylus input.
        Filter(rawStylusInput);
    }

    protected override void OnStylusUp(RawStylusInput rawStylusInput)
    {
        // Call the base class before modifying the data.
        base.OnStylusUp(rawStylusInput);

        // Restrict the stylus input
        Filter(rawStylusInput);
    }

    private void Filter(RawStylusInput rawStylusInput)
    {
        // Get the StylusPoints that have come in.
        StylusPointCollection stylusPoints = rawStylusInput.GetStylusPoints();

        // Modify the (X,Y) data to move the points 
        // inside the acceptable input area, if necessary.
        for (int i = 0; i < stylusPoints.Count; i++)
        {
            StylusPoint sp = stylusPoints[i];
            if (sp.X < 50) sp.X = 50;
            if (sp.X > 250) sp.X = 250;
            if (sp.Y < 50) sp.Y = 50;
            if (sp.Y > 250) sp.Y = 250;
            stylusPoints[i] = sp;
        }

        // Copy the modified StylusPoints back to the RawStylusInput.
        rawStylusInput.SetStylusPoints(stylusPoints);
    }
}
' A StylusPlugin that restricts the input area.
Class FilterPlugin
    Inherits StylusPlugIn

    Protected Overrides Sub OnStylusDown(ByVal rawStylusInput As RawStylusInput)
        ' Call the base class before modifying the data.
        MyBase.OnStylusDown(rawStylusInput)

        ' Restrict the stylus input.
        Filter(rawStylusInput)

    End Sub 'OnStylusDown


    Protected Overrides Sub OnStylusMove(ByVal rawStylusInput As RawStylusInput)
        ' Call the base class before modifying the data.
        MyBase.OnStylusMove(rawStylusInput)

        ' Restrict the stylus input.
        Filter(rawStylusInput)

    End Sub 'OnStylusMove


    Protected Overrides Sub OnStylusUp(ByVal rawStylusInput As RawStylusInput)
        ' Call the base class before modifying the data.
        MyBase.OnStylusUp(rawStylusInput)

        ' Restrict the stylus input
        Filter(rawStylusInput)

    End Sub 'OnStylusUp


    Private Sub Filter(ByVal rawStylusInput As RawStylusInput)
        ' Get the StylusPoints that have come in.
        Dim stylusPoints As StylusPointCollection = rawStylusInput.GetStylusPoints()

        ' Modify the (X,Y) data to move the points 
        ' inside the acceptable input area, if necessary.
        Dim i As Integer
        For i = 0 To stylusPoints.Count - 1
            Dim sp As StylusPoint = stylusPoints(i)
            If sp.X < 50 Then
                sp.X = 50
            End If
            If sp.X > 250 Then
                sp.X = 250
            End If
            If sp.Y < 50 Then
                sp.Y = 50
            End If
            If sp.Y > 250 Then
                sp.Y = 250
            End If
            stylusPoints(i) = sp
        Next i

        ' Copy the modified StylusPoints back to the RawStylusInput.
        rawStylusInput.SetStylusPoints(stylusPoints)

    End Sub 'Filter
End Class 'FilterPlugin

InkCanvas にプラグインを追加します。Adding Your Plug-in to an InkCanvas

カスタム プラグインを使用する最も簡単な方法は、InkCanvas から派生したクラスの実装を追加するには、StylusPlugInsプロパティ。The easiest way to use your custom plug-in is to implement a class that derives from InkCanvas and add it to the StylusPlugIns property.

次の例では、カスタムInkCanvas手描き入力をフィルター処理します。The following example demonstrates a custom InkCanvas that filters the ink.

public class FilterInkCanvas : InkCanvas
{
    FilterPlugin filter = new FilterPlugin();

    public FilterInkCanvas()
        : base()
    {
        this.StylusPlugIns.Add(filter);
    }
}

追加する場合、FilterInkCanvas実行、アプリケーションを表示されます、ユーザーがストロークが完了したらインクはまでの領域に制限されています。If you add a FilterInkCanvas to your application and run it, you will notice that the ink isn't restricted to a region until after the user completes a stroke. これは、ため、InkCanvasが、DynamicRendererであるプロパティをStylusPlugInのメンバーであると、StylusPlugInsコレクション。This is because the InkCanvas has a DynamicRenderer property, which is a StylusPlugIn and is already a member of the StylusPlugIns collection. カスタムStylusPlugInに追加した、StylusPlugInsコレクションには、StylusPoint後のデータDynamicRendererデータを受信します。The custom StylusPlugIn you added to the StylusPlugIns collection receives the StylusPoint data after DynamicRenderer receives data. 結果として、StylusPointユーザーがストロークを終了するペン離した後のデータはまでフィルターされません。As a result, the StylusPoint data will not be filtered until after the user lifts the pen to end a stroke. ユーザーが描画と手描き入力をフィルターするに挿入する必要があります、FilterPluginする前に、DynamicRendererします。To filter the ink as the user draws it, you must insert the FilterPlugin before the DynamicRenderer.

次の c# コードに示しますカスタムInkCanvas描画されると、手描き入力をフィルター処理します。The following C# code demonstrates a custom InkCanvas that filters the ink as it is drawn.

public class DynamicallyFilteredInkCanvas : InkCanvas
{
    FilterPlugin filter = new FilterPlugin();

    public DynamicallyFilteredInkCanvas()
        : base()
    {
        int dynamicRenderIndex = 
            this.StylusPlugIns.IndexOf(this.DynamicRenderer);
        
        this.StylusPlugIns.Insert(dynamicRenderIndex, filter);

    }

}

まとめConclusion

独自の派生によってStylusPlugInクラスとそれらに挿入するStylusPlugInCollectionコレクションのデジタル インクの動作を大幅に向上することができます。By deriving your own StylusPlugIn classes and inserting them into StylusPlugInCollection collections, you can greatly enhance the behavior of your digital ink. アクセスがある、StylusPointほどデータの生成をカスタマイズする機会を与える、Stylus入力します。You have access to the StylusPoint data as it is generated, giving you the opportunity to customize the Stylus input. このような低レベルのアクセス権があるため、StylusPointデータ、アプリケーションのインクの収集と最適なパフォーマンスの表示を実装することができます。Because you have such low-level access to the StylusPoint data, you can implement ink collection and rendering with optimal performance for your application.

関連項目See also