[WPF] Windowsでマルチタッチ
Windowsでマルチタッチ試してみた。
マルチタッチに対応しているのはOSはWindows7からで対応するアプリを開発するには.NetのWPF4以降か、Win32 APIを使う。Windos8以降だとWindowsストア向けに作れば対応できる。(Windowsストア向けは、まだ調べてない)
WPFアプリのプロジェクトを新規作成してCanvasを貼り付けて、TouchDown、TouchMove、TouchUpイベントを取ればマルチタッチが取れるようになる。これらのイベントはマウスのMouseDown、MouseMove、MouseUpイベントのタッチ版のようなものだ。
複数のタッチ(指)を認識するには、タッチイベントで渡されるTouchEventArgsのTouchDeviceのIdで複数の指を識別する。複数のタッチそれぞれにIDがふられてそれぞれイベントが発生することになる。
サンプルは、タッチしたところに赤丸(かなり大きいが(^^;))とIDが表示されるようになっている。ついでにマウスイベント、スタイラス(デジタイザペン)でも円を描画するようにしてる。マウスは青丸で押してるボタンを表示する。スタイラスは緑丸とIDを表示し、円は筆圧によって大きさが変わるようになっている。
これでわかるのが、タッチするとスタイラス、マウスのイベントが、スタイラスで画面を触るとマウスのイベントが発生する。この辺はそれぞれのEventArgsのhandledプロパティにtrueを設定すると発生しなくなるが、タッチ、スタイラスとも長押しすると右ボタンを押したマウスイベントは発生するようなので都合が悪い場合はなんか別の方法で回避しないといけない。(簡単な方法があるかは調べてないので不明)
全体を見ないとわからない部分もあるんだが、サンプルからタッチ関係のイベント部分を抜き取ったものものせとく。
/// <summary>
/// タッチダウンイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void canvas_TouchDown(object sender, TouchEventArgs e)
{
// 座標取得
TouchPoint p = e.GetTouchPoint(canvas);
// 図形生成
Mark mark = Mark.makeMark(e.TouchDevice.Id.ToString(), TOUCH_MARK_SIZE, Colors.Red);
// 図形をキャンバスへ追加
canvas.Children.Add(mark.ellipse);
canvas.Children.Add(mark.label);
canvas.UpdateLayout();
// 座標を指定
mark.SetPos(p.Position);
// タッチをキャプチャ
canvas.CaptureTouch(e.TouchDevice);
// IDごとに図形を保存
touchPoints[e.TouchDevice.Id] = mark;
}
/// <summary>
/// タッチムーブイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void canvas_TouchMove(object sender, TouchEventArgs e)
{
if (e.TouchDevice.Captured == canvas)
{
// IDごとの図形を取得
Mark mark = touchPoints[e.TouchDevice.Id];
// 座標を指定
TouchPoint p = e.GetTouchPoint(canvas);
mark.SetPos(p.Position);
}
}
/// <summary>
/// タッチアップイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void canvas_TouchUp(object sender, TouchEventArgs e)
{
// タッチキャプチャをリリース
canvas.ReleaseTouchCapture(e.TouchDevice);
// 図形を削除
canvas.Children.Remove(touchPoints[e.TouchDevice.Id].label);
canvas.Children.Remove(touchPoints[e.TouchDevice.Id].ellipse);
touchPoints.Remove(e.TouchDevice.Id);
}
« TypeScriptメモ(3) クラス | トップページ | NetBeansで日本語を入力すると落ちる - Така блог »
「Windowsプログラミング」カテゴリの記事
- Visual Studio Community 2013 再インストール時の”Setup Blocked”対処法 | seyjoh studio blog(2014.12.19)
- Microsoft、“Professional”相当の無償版「Visual Studio Community 2013」を公開 - 窓の杜(2014.11.13)
- [WPF] Windowsでマルチタッチ(2014.09.11)
- Windowsストアアプリのリモートデバッグ(2014.06.19)
- OpenCLのプログラム実行すると画面が数秒ブラックアウトして・・・(2014.04.07)
「プログラミング」カテゴリの記事
- Wii UでBASIC言語のプログラミングができる『プチコンBIG』が12月14日配信開始 - ファミ通.com(2016.12.07)
- プログラミング関係は別ブログに~(2015.04.21)
- Amazon.co.jp: 関数型プログラミングに目覚めた! IQ145の女子高校生の先輩から受けた特訓5日間: 岡部健: 本(2015.04.13)
- α版のリリースから1年4カ月、「Node.js Tools for Visual Studio」v1.0が正式版に - 窓の杜(2015.03.26)
- Nodeビギナーズブック » Node.jsチュートリアル » Node.js 教程(2015.03.13)
この記事へのコメントは終了しました。
« TypeScriptメモ(3) クラス | トップページ | NetBeansで日本語を入力すると落ちる - Така блог »


コメント