2025年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

« TypeScriptメモ(6) ジェネリクス | トップページ | フォルダーにぶち込むと画像をJPG一括変換「フォルダアクション」がスゴイ|Mac - 週アスPLUS »

2014.10.12

[WinRT] Windowsでマルチタッチ

前にWPFでマルチタッチを試してみたのと同様のWindowsストアアプリを試しに作ってみた。

Windowsストアアプリを新規作成して、canvasを張り付けてPointerPressed、PointerMoved、PointerReleasedイベントを取るようにする。
これらのイベントでマウス、ペン、タッチのイベントが発生する。
イベントで渡されるPointerRoutedEventArgsのGetCurrentPointで
PointerPointを取得してそのPointerDeviceのPointerDeviceTypeプロパティでマウス、ペン、タッチの区別ができる。
複数タッチを区別するのはPointerPointのPointerIdプロパティで行う。

サンプル:TestMultiTouchWS.zip

        /// <summary>
        /// ポインタープレスイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void canvas_PointerPressed(object sender, PointerRoutedEventArgs e)
        {
            PointerPoint point = e.GetCurrentPoint(canvas);
            // 座標取得
            Point p = point.Position;

            // 図形を生成
            Mark mark = null;
            switch (point.PointerDevice.PointerDeviceType)
            {
                case PointerDeviceType.Mouse:
                    mark = Mark.makeMark(getButtonText(point.Properties), Mark.MOUSE_MARK_SIZE, Colors.Blue);
                    break;
                case PointerDeviceType.Pen:
                    // 筆圧から円のサイズを算出
                    int size = (int)((Mark.STYLUS_MARK_SIZE_MAX - Mark.STYLUS_MARK_SIZE) * point.Properties.Pressure + Mark.STYLUS_MARK_SIZE);
                    mark = Mark.makeMark(point.PointerId.ToString(), size, Colors.Green);
                    break;
                case PointerDeviceType.Touch:
                    mark = Mark.makeMark(point.PointerId.ToString(), Mark.TOUCH_MARK_SIZE, Colors.Red);
                    break;
            }
            if (mark != null)
            {
                // 図形をキャンバスへ追加
                canvas.Children.Add(mark.label);
                canvas.Children.Add(mark.ellipse);
                canvas.UpdateLayout();

                // 座標を指定
                mark.SetPos(p);

                // ポインターをキャプチャ
                canvas.CapturePointer(e.Pointer);
                // IDごとに図形を保存
                pointerData[point.PointerId] = mark;
            }
        }

        /// <summary>
        /// ポインタームーブイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void canvas_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            Mark mark;

            PointerPoint point = e.GetCurrentPoint(canvas);
            if (point.IsInContact)
            {
                // IDごとの図形を取得
                mark = pointerData[point.PointerId];
                if (point.PointerDevice.PointerDeviceType == PointerDeviceType.Mouse)
                {
                    // ラベルにマウスのボタンの状態を設定
                    mark.label.Text = getButtonText(point.Properties);
                }
                else if (point.PointerDevice.PointerDeviceType == PointerDeviceType.Pen)
                {
                    // 筆圧から円のサイズを算出
                    int size = (int)((Mark.STYLUS_MARK_SIZE_MAX - Mark.STYLUS_MARK_SIZE) * point.Properties.Pressure + Mark.STYLUS_MARK_SIZE);
                    // 図形のサイズを指定
                    pointerData[point.PointerId].ellipse.Width = size;
                    pointerData[point.PointerId].ellipse.Height = size;
                    canvas.UpdateLayout();
                }
                // 座標を指定
                mark.SetPos(point.Position);
            }
        }

        /// <summary>
        /// ポインターリリースイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void canvas_PointerReleased(object sender, PointerRoutedEventArgs e)
        {
            PointerPoint point = e.GetCurrentPoint(canvas);

            // ポインターのキャプチャをリリース
            canvas.ReleasePointerCapture(e.Pointer);
            // 図形を削除
            canvas.Children.Remove(pointerData[point.PointerId].label);
            canvas.Children.Remove(pointerData[point.PointerId].ellipse);
            pointerData.Remove(point.PointerId);
        }

« TypeScriptメモ(6) ジェネリクス | トップページ | フォルダーにぶち込むと画像をJPG一括変換「フォルダアクション」がスゴイ|Mac - 週アスPLUS »

プログラミング」カテゴリの記事

WinRT」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [WinRT] Windowsでマルチタッチ:

« TypeScriptメモ(6) ジェネリクス | トップページ | フォルダーにぶち込むと画像をJPG一括変換「フォルダアクション」がスゴイ|Mac - 週アスPLUS »