次の方法で共有


C# サンプルでの Windows タッチ ジェスチャ (MTGesturesCS)

このセクションでは、C# の Windows タッチ ジェスチャのサンプルについて説明します。

この Windows タッチ ジェスチャ サンプルでは、ジェスチャ メッセージを使用して、 WM_GESTURE メッセージを処理してグラフィックス デバイス インターフェイス (GDI) によってレンダリングされたボックスを翻訳、回転、スケーリングする方法を示します。 次のスクリーン ショットは、実行中のサンプルの外観を示しています。

実行中の c シャープ サンプルの Windows タッチ ジェスチャを示すスクリーン ショット。画面の中央に黒い枠線の白い四角形がある

このサンプルでは、ジェスチャ メッセージがジェスチャ エンジンに渡され、描画オブジェクトのメソッドを呼び出して、これらのコマンドを処理するためのメソッドを持つオブジェクトを変換、回転、およびスケーリングします。 これを C# で可能にするために、ジェスチャ メッセージを処理する特殊なフォーム TouchableForm が作成されます。 このフォームでは、メッセージを使用して描画オブジェクト DrawingObject を変更し、Paint メソッドでのオブジェクトのレンダリング方法を変更します。

サンプルの動作を示すために、pan コマンドを使用してレンダリングされたボックスを翻訳する手順を検討してください。 ユーザーがパン ジェスチャを実行すると、ジェスチャ識別子 がGID_PANされたWM_GESTURE メッセージが生成されます。 TouchableForm は、このメッセージを処理し、描画オブジェクトの位置を更新し、オブジェクト自体が変換されてレンダリングされます。

次のコードは、ジェスチャ ハンドラーが WM_GESTURE メッセージからパラメーターを取得し、描画オブジェクトの move メソッドの呼び出しによってレンダリングされたボックスに対して変換を実行する方法を示しています。

            switch (gi.dwID)
            {
                case GID_BEGIN:
                case GID_END:
                    break;
               (...)
                case GID_PAN:
                    switch (gi.dwFlags)
                    {
                        case GF_BEGIN:
                            _ptFirst.X = gi.ptsLocation.x;
                            _ptFirst.Y = gi.ptsLocation.y;
                            _ptFirst = PointToClient(_ptFirst);
                            break;

                        default:
                            // We read the second point of this gesture. It is a
                            // middle point between fingers in this new position
                            _ptSecond.X = gi.ptsLocation.x;
                            _ptSecond.Y = gi.ptsLocation.y;
                            _ptSecond = PointToClient(_ptSecond);

                            // We apply move operation of the object
                            _dwo.Move(_ptSecond.X - _ptFirst.X, _ptSecond.Y - _ptFirst.Y);

                            Invalidate();

                            // We have to copy second point into first one to
                            // prepare for the next step of this gesture.
                            _ptFirst = _ptSecond;
                            break;
                    }
                    break;

次のコードは、描画オブジェクトの move メソッドが内部位置変数を更新する方法を示しています。

        public void Move(int deltaX,int deltaY)
        {
            _ptCenter.X += deltaX;
            _ptCenter.Y += deltaY;
        }

次のコードは、描画オブジェクトのペイント メソッドで位置がどのように使用されるかを示しています。

public void Paint(Graphics graphics)
        {
(...)
            for (int j = 0; j < 5; j++)
            {
                int idx = arrPts[j].X;
                int idy = arrPts[j].Y;

                // rotation
                arrPts[j].X = (int)(idx * dCos + idy * dSin);
                arrPts[j].Y = (int)(idy * dCos - idx * dSin);

                // translation
                arrPts[j].X += _ptCenter.X;
                arrPts[j].Y += _ptCenter.Y;
            }
(...)
        }

パン ジェスチャを実行すると、描画されたボックスが翻訳されてレンダリングされます。

マルチタッチ ジェスチャ アプリケーション (C#)マルチタッチ ジェスチャ アプリケーション (C++)Windows タッチ サンプル