インク オブジェクト モデル:Windows フォームおよび COM と WPF の比較

基本的に、デジタル インクをサポートするプラットフォームは 3 つあります。TabletPC Windows フォーム プラットフォーム、Tablet PC COM プラットフォーム、および Windows Presentation Foundation (WPF) プラットフォームです。 Windows フォームと COM プラットフォームは同様のオブジェクト モデルを共有しますが、WPF プラットフォームのオブジェクト モデルは大きく異なります。 このトピックでは、あるオブジェクト モデルを使用して作業した開発者が他のオブジェクト モデルを理解しやすくなるように、違いを大まかに説明します。

アプリケーションでのインクの有効化

すべての 3 つのプラットフォームには、アプリケーションでタブレット ペンからの入力を受け取るができるようにするオブジェクトとコントロールが含まれています。 Windows フォームと COM プラットフォームには、Microsoft.Ink.InkPictureMicrosoft.Ink.InkEditMicrosoft.Ink.InkOverlay、および Microsoft.Ink.InkCollector クラスが含まれています。 Microsoft.Ink.InkPictureMicrosoft.Ink.InkEdit は、インクを収集するためにアプリケーションに追加できるコントロールです。 Microsoft.Ink.InkOverlayMicrosoft.Ink.InkCollector を既存のウィンドウに添付して、ウィンドウとカスタム コントロールをインク対応にすることができます。

WPF プラットフォームには InkCanvas コントロールが含まれています。 アプリケーションに InkCanvas を追加して、すぐにインクの収集を開始できます。 InkCanvas を使用すると、ユーザーはインクのコピー、選択、およびサイズ変更を行うことができます。 他のコントロールを InkCanvas に追加することができます。ユーザーはそれらのコントロールに手書きすることもできます。 InkPresenter を追加してそのスタイラス ポイントを収集することにより、インク対応のカスタム コントロールを作成できます。

アプリケーションでインクを有効にする方法の詳細を次の表に示します。

目的 WPF プラットフォームの場合 Windows フォーム または COM プラットフォームの場合
アプリケーションにインク対応コントロールを追加する インクの概要に関するページを参照してください。 自動要求フォーム サンプル」を参照してください
カスタム コントロールでインクを有効にする インク入力コントロールの作成」を参照してください。 インク クリップボードのサンプル」を参照してください。

インク データ

Windows フォームと COM プラットフォームでは、Microsoft.Ink.InkCollectorMicrosoft.Ink.InkOverlayMicrosoft.Ink.InkEdit、および Microsoft.Ink.InkPicture のそれぞれによって Microsoft.Ink.Ink オブジェクトが公開されます。 Microsoft.Ink.Ink オブジェクトには、1 つ以上の Microsoft.Ink.Stroke オブジェクトのデータが含まれ、それらのストロークを管理および操作するための一般的なメソッドとプロパティが公開されています。 Microsoft.Ink.Ink オブジェクトでは、含まれているストロークの有効期間を管理します。Microsoft.Ink.Ink オブジェクトでは、所有するストロークを作成および削除します。 各 Microsoft.Ink.Stroke には、親の Microsoft.Ink.Ink オブジェクト内で一意の識別子があります。

WPF プラットフォームでは、System.Windows.Ink.Stroke クラスには自身の有効期間が所有および管理されます。 Stroke オブジェクトのグループは、StrokeCollection でまとめて収集できます。これには、インクのヒット テスト、消去、変換、シリアル化などの一般的なインク データ管理操作のメソッドが用意されています。 Stroke は、任意の時点で 0 個、1 個、または複数の StrokeCollection オブジェクトに属する可能性があります。 InkCanvasInkPresenter には、Microsoft.Ink.Ink オブジェクトではなく System.Windows.Ink.StrokeCollection が含まれています。

次の 2 つの図では、インク データ オブジェクト モデルを比較しています。 Windows フォームと COM プラットフォームでは、Microsoft.Ink.Ink オブジェクトによって Microsoft.Ink.Stroke オブジェクトの有効期間が制限され、スタイラス パケットは個々のストロークに属します。 次の図に示すように、複数のストロークから同じ Microsoft.Ink.DrawingAttributes オブジェクトを参照できます。

Diagram of the Ink Object Model for COM/Winforms.

WPF では、各 System.Windows.Ink.Stroke は共通言語ランタイム オブジェクトです。これは、それを参照する何かがある限り存在します。 各 Stroke は、共通言語ランタイム オブジェクトでもある StylusPointCollection および System.Windows.Ink.DrawingAttributes オブジェクトを参照してください。

Diagram of the Ink Object Model for WPF.

次の表では、WPF プラットフォームと Windows フォームおよび COM プラットフォーム上でいくつかの一般的なタスクを実行する方法を比較しています。

タスク Windows Presentation Foundation Windows フォームと COM
インクを保存する Save Microsoft.Ink.Ink.Save
インクを読み込む StrokeCollection コンストラクターを使用して StrokeCollection を作成します。 Microsoft.Ink.Ink.Load
ヒット テスト HitTest Microsoft.Ink.Ink.HitTest
インクをコピーする CopySelection Microsoft.Ink.Ink.ClipboardCopy
インクを貼り付ける Paste Microsoft.Ink.Ink.ClipboardPaste
ストロークのコレクションのカスタム プロパティにアクセスする AddPropertyData (プロパティは内部的に格納され、AddPropertyDataRemovePropertyData、および ContainsPropertyData を介してアクセスされます) Microsoft.Ink.Ink.ExtendedProperties を使用します

プラットフォーム間でインクを共有する

プラットフォームにはインク データ用のさまざまなオブジェクト モデルがありますが、プラットフォーム間でのデータの共有は非常に簡単です。 次の例では、Windows フォーム アプリケーションからインクを保存し、そのインクを 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

次の例では、Windows Presentation Foundation アプリケーションからインクを保存し、Windows フォーム アプリケーションにインクを読み込みます。

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

タブレットペンからのイベント

Windows フォームおよび COM プラットフォーム上の Microsoft.Ink.InkOverlayMicrosoft.Ink.InkCollector、および Microsoft.Ink.InkPicture は、ユーザーがペン データを入力したときにイベントを受け取ります。 Microsoft.Ink.InkOverlay または Microsoft.Ink.InkCollector はウィンドウまたはコントロールに添付され、これを使用してタブレット入力データによって発生したイベントを登録できます。 これらのイベントが発生するスレッドは、イベントがペン、マウス、またはプログラムのいずれで発生したかによって変わります。 これらのイベントに関連するスレッドの詳細については、「スレッドに関する一般的な考慮事項」と「イベントが発生する可能性のあるスレッド」を参照してください。

Windows Presentation Foundation プラットフォームでは、UIElement クラスにはペン入力のイベントがあります。 これは、すべてのコントロールではスタイラス イベントの完全なセットが公開されていることを意味します。 スタイラス イベントにはトンネリングおよびバブリング イベントのペアがあり、常にアプリケーション スレッド上で発生します。 詳細については、「ルーティング イベントの概要」を参照してください。

次の図では、スタイラス イベントを発生させるクラスのオブジェクト モデルを比較しています。 Windows Presentation Foundation オブジェクト モデルでは、バブリング イベントのみが表示され、対応するトンネル イベントは表示されません。

Diagram of the Stylus events in WPF vs Winforms.

ペン データ

すべての 3 つのプラットフォームには、タブレット ペンからのデータを取得して操作する方法が用意されています。 Windows フォームと COM プラットフォームでは、これを実行するには、Microsoft.StylusInput.RealTimeStylus を作成し、それにウィンドウまたはコントロールを添付し、Microsoft.StylusInput.IStylusSyncPlugin または Microsoft.StylusInput.IStylusAsyncPlugin インターフェイスを実装するクラスを作成します。 これで、カスタム プラグインが Microsoft.StylusInput.RealTimeStylus のプラグイン コレクションに追加されます。 このオブジェクト モデルの詳細については、「StylusInput API のアーキテクチャ」を参照してください。

WPF プラットフォームでは、UIElement クラスによって、設計が Microsoft.StylusInput.RealTimeStylus と同様のプラグインのコレクションが公開されています。 ペン データを取得するには、StylusPlugIn から継承するクラスを作成し、そのオブジェクトを UIElementStylusPlugIns コレクションに追加します。 この相互作用の詳細については、「スタイラスからの入力のインターセプト」を参照してください。

すべてのプラットフォームで、スレッド プールではスタイラス イベントを介してインク データが受け取られ、それがアプリケーション スレッドに送信されます。 COM および Windows プラットフォームでのスレッド処理の詳細については、「StylusInput API のスレッドに関する考慮事項」を参照してください。 Windows プレゼンテーション ソフトウェアでのスレッドの詳細については、「インク スレッド モデル」を参照してください。

次の図では、ペン スレッド プールでペンデータを受け取るクラスのオブジェクト モデルを比較しています。

Diagram of the StylusPlugin model WPF vs Winforms.