インフラジスティックス・ジャパン株式会社のBlog

インフラジスティックス・ジャパン株式会社のチームメンバーが技術トレンド、製品Tips、サポート情報からライセンス、日々の業務から感じることなど、さまざまなトピックについてお伝えするBlogです。

WindowsFormsコントロールのタッチサポートについて(イベント編)

タッチデバイス普及が進む中、NetAdvantage for Windows Formsではバージョン13.1よりタッチサポートが開始されました。前回のブログ(デザイン編)では、各コントロールの見た目がどのように変化するのか、そのデザインの変化をどう画面に組み込むかというところをご紹介しました。今回は、どのようにタッチ/ジェスチャイベントをハンドリングできるか、あるいはどのような事ができるようになるのかといったところをグリッドを使った具体例を含めてご紹介したいと思います。

タッチイベントの紹介

.Net framework自体では既にタッチ対応しており、WPF4よりタッチイベントが加わりタッチやジェスチャに対応したアプリケーションを比較的簡単に組むことができるようになりました。しかし、Windows Formsにおいてはタッチをハンドリングするためには、Windowsメッセージを直接処理しなければならないため、実装がとても複雑になってしまいます。

MSDNでもタッチに関する実装方法や具体的なサンプルコードが紹介されています。

MSDN Windows タッチ アーキテクチャの概要:
http://msdn.microsoft.com/ja-jp/library/windows/desktop/dd371413%28v=vs.85%29.aspx

MSDN 操作と慣性のサンプル:
http://msdn.microsoft.com/ja-jp/library/windows/desktop/dd562174%28v=vs.85%29.aspx

NetAdvantage for Windows Forms 2013 Vol1のタッチ対応では、各コントロール毎にタッチ/ジェスチャイベントが追加され、ホールドや回転、パン、慣性スクロールなどタッチ特有の操作をコントロールのイベントで処理できるようになりました。
そのため、Windowsメッセージを処理するといったような事は一切考える必要はなく、クリックイベントをハンドルするのと同じ感覚でジェスチャ操作を容易にイベントハンドリングできます。

jp.infragistics.com

タッチ ジェスチャイベントの種類とその詳細は以下のリンクより確認いただけます。

jp.infragistics.com

■グリッドを使った具体例

UltraWinGridのジェスチャイベントをハンドリングして、少しカスタマイズしてみたいと思います。

・UltraWinGridの慣性スクロールを無効に設定する。

慣性スクロールは、上下のフリックモーション後に指を離した後もある程度スクロールが維持される機能ですが、この動作をした時、Grid内部では PanGesture イベントが呼ばれ続けます。このイベント内で IsInertial プロパティでトリガーが慣性によるものかどうかを判断し、慣性によるイベントコールであればHandledをTrueに設定します。

        private void ultraGrid1_PanGesture(object sender, Infragistics.Win.Touch.PanGestureEventArgs e)
        {
            Debug.WriteLine("ultraGrid1_PanGesture: " + e.Gesture.ToString());
            //慣性ジェスチャをキャンセルする。
            if (e.IsInertial == true)
            {
                e.Handled = true;
            }
        }

・長押しタッチ(PressAndHold)されたセルに対して処理する。

まずはコードを御覧ください。以下のコードでは、長押しタッチされたセルの文字色を赤色へ変更しています。

        private Point p = new Point(0, 0);      //GestureCompleted時のタッチ位置保持用
        private Boolean isPressAndHold = false; //PressAndHoldの場合のみTrueに設定
        //GestureCompletedイベント
        private void ultraGrid1_GestureCompleted(object sender, Infragistics.Win.Touch.GestureCompletedEventArgs e)
        {
            //ジェスチャの種類を判定
            if (e.Gesture.Equals(Gesture.PressAndHold))
            {
                //タッチフラグをOnに設定
                isPressAndHold = true;
                //タッチ位置を保持する
                p = e.Location;

            }
        }

        //Clickイベント
        private void ultraGrid1_Click(object sender, EventArgs e)
        {
            //PressAndHold時のクリックかどうかを判定
            if (isPressAndHold)
            {
                //タッチ座標からエレメントを取得
                UIElement element = ultraGrid1.DisplayLayout.UIElement.ElementFromPoint(p);
                UltraGridCell cell = element.GetContext(typeof(UltraGridCell)) as UltraGridCell;
                //取得したエレメントがセルかどうかの判定
                if (cell != null)
                {
                    //長押しされたElementがCellだった場合、文字色を赤へ変更
                    cell.Appearance.ForeColor = Color.Red;
                }
            }
            //フラグの初期化
            isPressAndHold = false;
        }

長押しタッチを行い指を離した瞬間、GestureCompletedイベントが走ります。すべてのジェスチャイベントの最後にこのGestureCompletedイベントが走るためイベント内ではまずジェスチャの判定をしています。このコードではジェスチャがPressAndHoldだった場合は、長押しタッチを判定するためのフラグ(isPressAndHold)をTrueに設定し、更に長押しされたPositionを保持します。(今回は指を離したタイミングで処理をさせるためにCompleteイベントを使用していますが、長押し判定の規定時間に達した時点で処理を行う場合には、上記コードではこのイベントでPressAndHoldGestureイベントを利用します。)

image

また、通常のタッチや長押しタッチを行った場合、GestureCompletedイベントの後にClickイベントが呼び出されます。
このコードでは、Clickイベント内でPressAndHoldによりクリックイベントが呼び出されたかどうかを判断した後で、保存したPositionからElementFromPointメソッドによりグリッドの長押しタッチされたエレメントを取得しています。
取得したエレメントがUltraGridCellであった場合、今回は取得したセルに対して文字色を赤にするという処理を行なっています。

なぜGestureCompletedイベント内でエレメントの取得を行わないのかというと、これはGestureCompletedイベント内では長押しタッチ用のエレメントがタッチされているPositionに展開されているためで、ここでElementFromPointメソッドでエレメントを取得するとUltraGridCellElementではなくPressAndHoldIndicatorUIElementが取得されてしまうからです。そのため、Gestureの種類とPositionを保持しておき、直後に呼び出されるClickイベントで処理を行なっているのです。

今回ご紹介したイベント以外にもオンラインヘルプで様々なジェスチャイベントが紹介されておりますので、興味のある方は是非一度ご確認いただければと思います。

 

 

 

 

【サンプル】

今回のサンプルのダウンロードはこちらから(コードはC#です。)

【関連リンク】

blogs.jp.infragistics.com

今回ご紹介した NetAdvantage(Infragistics Ultimate) は無料でトライアル版が利用できます。

jp.infragistics.com