次の方法で共有


RealTimeStylus Ink Collection のサンプル

このアプリケーションは、 RealTimeStylus クラスを使用する場合のインクの収集とレンダリングを示します。

InkCollection プロジェクト

このサンプルは、1 つのプロジェクト InkCollection を含む 1 つのソリューションで構成されています。 アプリケーションは、 とも呼ばれる InkCollection1 つのクラスを含む名前空間を定義InkCollectionします。 クラスは Form クラスを継承し、 IStylusAsyncPlugin インターフェイスを 実装します。

namespace InkCollection
{
    public class InkCollection : Form, IStylusAsyncPlugin
    {
        //...
      

InkCollection クラスは、さまざまなインクの太さを指定するために使用されるプライベート定数のセットを定義します。 また、 クラスは、RealTimeStylus クラス、DynamicRenderer クラス、myRealTimeStylusおよび RenderermyRendererクラス myDynamicRendererのプライベート インスタンスも宣言します。 DynamicRenderer は、現在収集されている Stroke をレンダリングします。 Renderer オブジェクト は、 myRenderer既に収集されている Stroke オブジェクトをレンダリングします。

private const float ThinInkWidth = 10;
private const float MediumInkWidth = 100;
private const float ThickInkWidth = 200;

private RealTimeStylus myRealTimeStylus;

private DynamicRenderer myDynamicRenderer;
private Renderer myRenderer;

クラスは Hashtable オブジェクトも宣言します。これは、 myPackets1 つ以上の Cursor オブジェクトによって収集されるパケット データを格納するために使用されます。 Stylus オブジェクトの Id 値は、特定の Cursor オブジェクトに対して収集されたパケット データを一意に識別するためのハッシュテーブル キーとして使用されます。

Ink オブジェクト のプライベート インスタンスである には、 myInkによってmyRealTimeStylus収集された Stroke オブジェクトが格納されます。

private Hashtable myPackets;
        
private Ink myInk;

フォーム読み込みイベント

フォームの Load イベント ハンドラーでは、 myDynamicRenderer は引数としてコントロールを受け取る DynamicRenderer を使用してインスタンス化され myRenderer 、引数なしのコンストラクターで構築されます。

private void InkCollection_Load(object sender, System.EventArgs e)
{
    myDynamicRenderer = new DynamicRenderer(this);
    myRenderer = new Renderer();
    // ...

インクのレンダリング時に DrawingAttributes の既定値が使用されるためmyDynamicRenderer、レンダラーのインスタンス化に続くコメントに注意してください。 これは標準的な動作です。 ただし、 によってレンダリングされるインクとは異なる外観で myDynamicRenderer レンダリングされる myRendererインクを指定する場合は、 の DrawingAttributes プロパティを myDynamicRenderer変更できます。 これを行うには、アプリケーションをビルドして実行する前に、次の行のコメントを解除します。

    // myDynamicRenderer.DrawingAttributes.PenTip = PenTip.Rectangle;
    // myDynamicRenderer.DrawingAttributes.Height = (.5F)*MediumInkWidth;
    // myDynamicRenderer.DrawingAttributes.Transparency = 128;

次に、スタイラス通知を受信するために使用される RealTimeStylus オブジェクトを作成し、 DynamicRenderer オブジェクトを同期プラグイン通知キューに追加します。 具体的には、 myRealTimeStylusSyncPluginCollection プロパティに を追加myDynamicRendererします。

    myRealTimeStylus = new RealTimeStylus(this, true);

    myRealTimeStylus.SyncPluginCollection.Add(myDynamicRenderer);

その後、フォームが非同期プラグイン通知キューに追加されます。 具体的には、 InkCollectionAsyncPluginCollection プロパティに追加されます。 最後に、 myRealTimeStylusmyDynamicRenderer が有効になり、myPackets と myInk がインスタンス化されます。

    myRealTimeStylus.AsyncPluginCollection.Add(this);

    myRealTimeStylus.Enabled = true;
    myDynamicRenderer.Enabled = true;  
      
    myPackets = new Hashtable();
    myInk = new Ink();
}

インクの色とサイズを変更するためにメニュー ハンドラーをフックする以外に、インターフェイスを実装する前にもう 1 つの簡単なコード ブロックが必要です。 サンプルでは、フォームの Paint イベントを処理する必要があります。 イベント ハンドラーでは、Paint イベントが発生した時点で Stroke オブジェクトが収集される可能性があるため、アプリケーションを更新myDynamicRendererする必要があります。 その場合は、既に収集されている Stroke オブジェクトの部分を再描画する必要があります。 静的 レンダラー は、既に収集されている Stroke オブジェクトを再描画するために使用されます。 次のセクションに示すように、これらのストロークは描画時にそこに配置されるため、 Ink オブジェクト内にあります。

private void InkCollection_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    myDynamicRenderer.Refresh();

    myRenderer.Draw(e.Graphics, myInk.Strokes);
} 

IStylusAsyncPlugin インターフェイスの実装

サンプル アプリケーションでは、 DataInterest プロパティの実装で受け取る目的の通知の種類を定義します。 したがって、DataInterest プロパティは 、RealTimeStylus オブジェクトがフォームに転送する通知を定義します。 このサンプルでは、DataInterest プロパティによって、DataInterestMask 列挙体を介した StylusDownPacketsStylusUp、および Error 通知への関心が定義されます。

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

StylusDown 通知は、ペンがデジタイザーサーフェスに触れたときに発生します。 この場合、サンプルは Stylus オブジェクトのパケット データを格納するために使用される配列を割り当てます。 StylusDown メソッドの StylusDownData が配列に追加され、スタイラス オブジェクトの Id プロパティをキーとして使用して、配列がハッシュテーブルに挿入されます。

public void StylusDown(RealTimeStylus sender, StylusDownData data)
{
    ArrayList collectedPackets = new ArrayList();

    collectedPackets.AddRange(data.GetData());

    myPackets.Add(data.Stylus.Id, collectedPackets);
}

パケット通知は、ペンがデジタイザーサーフェス上で移動したときに発生します。 この場合、アプリケーションはスタイラス オブジェクトのパケット配列に新しい StylusDownData を追加します。 これを行うために、スタイラス オブジェクトの Id プロパティを キーとして使用して、ハッシュテーブルからスタイラスのパケット配列を取得します。 その後、新しいパケット データが取得された配列に挿入されます。

public void Packets(RealTimeStylus sender, PacketsData data)
{
    ((ArrayList)(myPackets[data.Stylus.Id])).AddRange(data.GetData());
}

StylusUp 通知は、ペンがデジタイザー画面から離れると発生します。 この通知が発生すると、サンプルは、不要になったハッシュテーブルからこの スタイラス オブジェクトのパケット配列を取得し、新しいパケット データを追加し、パケット データの配列を使用して新しい Stroke オブジェクト を作成します stroke

public void StylusUp(RealTimeStylus sender, StylusUpData data)
{
    ArrayList collectedPackets = (ArrayList)myPackets[data.Stylus.Id];
    myPackets.Remove(data.Stylus.Id);

    collectedPackets.AddRange(data.GetData());

    int[] packets = (int[])(collectedPackets.ToArray(typeof(int)));
    TabletPropertyDescriptionCollection tabletProperties =
        myRealTimeStylus.GetTabletPropertyDescriptionCollection(data.Stylus.TabletContextId);

    Stroke stroke = myInk.CreateStroke(packets, tabletProperties);
    if (stroke != null) 
    {
         stroke.DrawingAttributes.Color = myDynamicRenderer.DrawingAttributes.Color;
         stroke.DrawingAttributes.Width = myDynamicRenderer.DrawingAttributes.Width;
    } 
}

カスタム プラグインの作成の使用など、 RealTimeStylus クラスのより堅牢な使用方法を示す例については、「 RealTimeStylus プラグインサンプル」を参照してください。

Microsoft.Ink.Renderer

Microsoft.StylusInput.DynamicRenderer

Microsoft.StylusInput.RealTimeStylus

Microsoft.StylusInput.IStylusAsyncPlugin

スタイラス入力へのアクセスと操作