Win32, Silverlight 3, WPF 4 の Windows 7 マルチタッチへの対応
Windows 7 の新機能にマルチタッチがあります。Win32, Silverlight 3, WPF 4 はそれぞれ Windows 7 マルチタッチに対応していますが、それぞれ特徴があるのでここでまとめます。
- 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 は WM_TOUCH にのみ対応します。
- マルチタッチを処理するには、UIElementのようなオブジェクトにイベントハンドラーを追加するのではなく、System.Windows.Input.Touch.FrameReported にTouchFrameEventHandler イベントハンドラーを追加します。
- そのコールバック内で、TouchFrameEventArg の GetPrimaryTouchPoint メソッドなどを使ってタッチポイントを取得します。
- DevCornerにサンプルがあります。
- 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で対応) | 〇 |