Jaa


Win32, Silverlight 3, WPF 4 の Windows 7 マルチタッチへの対応

Windows 7 の新機能にマルチタッチがあります。Win32, Silverlight 3, WPF 4 はそれぞれ Windows 7 マルチタッチに対応していますが、それぞれ特徴があるのでここでまとめます。

Win32

  • WM_TOUCH メッセージは最も下位レベルのメッセージで(生のメッセージ)、複数のタッチIDと位置などが取得できます。Win32 でこのメッセージを受け取るには RegisterTouchWindow を呼び出す必要があります。
  • WM_GESTURE メッセージは上位レベルのメッセージで、パン・ズーム・回転の情報を取得できます。Win32 ではデフォルトでこのメッセージを受け取れますが、RegisterTouchWindow を呼び出すと WM_TOUCH しか受け取れません、つまり WM_TOUCH と WM_GESTURE は排他です。
  • Manipulation & Inertia は WM_TOUCHと組み合わせて、ManipulationEventSink を実装することによって、移動や回転の慣性や減衰の処理ができます。
  • Windows 7 SDK にサンプルがあります。

Silverlight 3

  • Silverlight 3 は WM_TOUCH にのみ対応します。
  • マルチタッチを処理するには、UIElementのようなオブジェクトにイベントハンドラーを追加するのではなく、System.Windows.Input.Touch.FrameReported にTouchFrameEventHandler イベントハンドラーを追加します。
  • そのコールバック内で、TouchFrameEventArg の GetPrimaryTouchPoint メソッドなどを使ってタッチポイントを取得します。
  • DevCornerにサンプルがあります。

WPF 4

  • Beta 1 では WM_TOUCH に対応していません(Beta 2 から対応予定)。
  • WPF 4 では Maniputaion & Inertia と WM_GESTURE が統合されています(Gestureという用語が使われていないので、分かりにくくなっています)。UIElement.ManipulationMode に Translate, Scale, Rotate などを設定することにより、パン・ズーム・回転を処理できます。
  • OnManipulationStarted や OnManipulationDelta、あるいはOnInertiaStarted などをオーバーライドして、それぞれの動きを実装します。
  • Visual Studio 2010 and .NET Framework 4 Training Kit - May Preview にサンプルがあります。

 

まとめるとこんな感じです。

  WM_TOUCH WM_GESTURE Manip&Inertia
Win32
Silverlight 3 × ×
WPF 4(Beta1) × (Beta2で対応)