次の方法で共有


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

更新 : 2007 年 11 月

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

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

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

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

アプリケーションでのインクの有効化に関する詳細の参照先を次の表に示します。

目的

WPF プラットフォームの場合

Windows フォームおよび COM プラットフォームの場合

アプリケーションへのインク対応コントロールの追加

インクの概要」を参照してください。

Auto Claims Form Sample を参照してください。

カスタム コントロールでのインクの有効化

インク入力コントロールの作成」を参照してください。

Ink Clipboard Sample」を参照してください。

インク データ

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

WPF プラットフォームでは、System.Windows.Ink.Stroke クラスがその有効期間を所有および管理します。Stroke オブジェクトのグループを StrokeCollection 内に収集できます。このコレクションは、インクのヒット テスト、消去、変換、シリアル化などの一般的なインク データ管理操作のためのメソッドを提供します。Stroke は、どの時点でも 0 個以上の StrokeCollection オブジェクトに属することができます。InkCanvas および InkPresenter には、Microsoft.Ink.Ink オブジェクトではなく System.Windows.Ink.StrokeCollection が含まれます。

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

COM/Winforms のインク オブジェクト モデルのダイアグラム。

WPF では、各 System.Windows.Ink.Stroke は、参照される限り存在する共通言語ランタイム オブジェクトです。各 StrokeStylusPointCollection および System.Windows.Ink.DrawingAttributes オブジェクトを参照します。これらのオブジェクトも共通言語ランタイム オブジェクトです。

WPF のインク オブジェクト モデルのダイアグラム。

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

タスク

Windows Presentation Foundation

Windows フォームおよび COM

インクの保存

Save

Save

インクの読み込み

StrokeCollection.StrokeCollection(Stream) コンストラクタで StrokeCollection を作成します。

Load

ヒット テスト

HitTest

HitTest

インクのコピー

CopySelection

ClipboardCopy

インクの貼り付け

Paste

ClipboardPaste

ストロークのコレクションのカスタム プロパティへのアクセス

AddPropertyData (プロパティは内部的に格納され、AddPropertyDataRemovePropertyData、および ContainsPropertyData をとおしてアクセスされます。)

ExtendedProperties を使用します。

プラットフォーム間でのインクの共有

各プラットフォームでインク データのオブジェクト モデルは異なりますが、プラットフォーム間でのデータの共有は非常に簡単です。Windows フォーム アプリケーションのインクを保存して Windows Presentation Foundation アプリケーションに読み込む方法を次の例に示します。

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>
Function SaveInkInWinforms(ByVal inkToSave As Ink) As MemoryStream 
    Dim savedInk As Byte() = inkToSave.Save()

    Return New MemoryStream(savedInk)

End Function 'SaveInkInWinforms
using Microsoft.Ink;
using 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));

}
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 Sub LoadInkInWPF(ByVal inkStream As MemoryStream) 
    strokes = New StrokeCollection(inkStream)

End Sub 'LoadInkInWPF

using 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);
}

Windows Presentation Foundation アプリケーションのインクを保存して Windows フォーム アプリケーションに読み込む方法を次の例に示します。

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>
Function SaveInkInWPF(ByVal strokesToSave As StrokeCollection) As MemoryStream 
    Dim savedInk As New MemoryStream()

    strokesToSave.Save(savedInk)

    Return savedInk

End Function 'SaveInkInWPF

using 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;
}
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 Sub LoadInkInWinforms(ByVal savedInk As MemoryStream) 
    theInk = New Ink()
    theInk.Load(savedInk.ToArray())

End Sub 'LoadInkInWinforms
using Microsoft.Ink;
using 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());
}

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

Windows フォームおよび COM プラットフォームの InkOverlayInkCollector、および InkPicture は、ユーザーがペン データを入力するとイベントを受信します。InkOverlay または InkCollector はウィンドウまたはコントロールに結合され、タブレット入力データによって発生するイベントにサブスクライブできます。このようなイベントが発生するスレッドは、イベントがペン、マウス、またはプログラムのいずれの方法で発生するかによって異なります。これらのイベントに関するスレッド処理の詳細については、「General Threading Considerations」および「Threads on Which an Event Can Fire」を参照してください。

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

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

WPF と Winforms のスタイラス イベントのダイアグラム。

ペン データ

3 つのすべてのプラットフォームで、タブレット ペンからのデータを途中受信および操作する方法が用意されています。Windows フォームおよび COM プラットフォームでは、これを行うために、RealTimeStylus を作成してウィンドウまたはコントロールと結合し、IStylusSyncPlugin または IStylusAsyncPlugin インターフェイスを実装するクラスを作成します。次に、カスタム プラグインが RealTimeStylus のプラグイン コレクションに追加されます。このオブジェクト モデルの詳細については、「Architecture of the StylusInput APIs」を参照してください。

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

すべてのプラットフォームで、スレッド プールがスタイラス イベントを介してインク データを受信し、アプリケーション スレッドに送信します。COM プラットフォームおよび Windows プラットフォームでのスレッド処理の詳細については、「Threading Considerations for the StylusInput APIs」を参照してください。Windows Presentation Foundation でのスレッド処理の詳細については、「インク スレッド モデル」を参照してください。

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

StylusPlugin モデル WPF と Winforms のダイアグラム。