RealTimeStylus Ink Collection のサンプル
このアプリケーションは、 RealTimeStylus クラスを使用する場合のインクの収集とレンダリングを示します。
InkCollection プロジェクト
このサンプルは、1 つのプロジェクト InkCollection を含む 1 つのソリューションで構成されています。 アプリケーションは、 とも呼ばれる InkCollection
1 つのクラスを含む名前空間を定義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 オブジェクトも宣言します。これは、 myPackets
1 つ以上の 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 オブジェクトを同期プラグイン通知キューに追加します。 具体的には、 myRealTimeStylus
SyncPluginCollection プロパティに を追加myDynamicRenderer
します。
myRealTimeStylus = new RealTimeStylus(this, true);
myRealTimeStylus.SyncPluginCollection.Add(myDynamicRenderer);
その後、フォームが非同期プラグイン通知キューに追加されます。 具体的には、 InkCollection
が AsyncPluginCollection プロパティに追加されます。 最後に、 myRealTimeStylus
と myDynamicRenderer
が有効になり、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 列挙体を介した StylusDown、Packets、StylusUp、および 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 プラグインサンプル」を参照してください。
関連トピック