WindowsMobileのGestureAPIに関する情報が少ないのと GestureAPIで検索するとWindows7の情報が出てくる&似てるけど異なる部分があるのでメモ。
タッチスライドした場合のウインドウメッセージの発生順は以下になる。 WM_LBUTTONDOWN WM_GESTURE(GID_BEGIN) WM_GESTURE(GID_PAN) ←タッチ中繰り返し WM_GESTURE(GID_END) WM_GESTURE(GID_SCROLL) WM_LBUTTONUP
またGID_PANについては連続する場合先頭にGF_BEGIN、末尾にGF_ENDが付く。 この二つは同時に付く場合もある。(GID_PANが一つのみの場合) GID_SCROLLはゆっくりタッチした場合などに来ない場合がある。
陥りやすいミスとしてGID_XXXはwParamに入ってること。 Windows7だとGESTUREINFOのdwIDとなっているので要注意。 (もしかしたら改定されて今はwParamなのかも知れないがネット上だと上記がでてくる) 現時点ではGID_ROTATE、GID_SCROLLなどは定義されていない。 (WindowsMobile7でマルチタッチ用に定義が増えるのかもしれない)
・GID_PANでの処理 GESTUREINFOのptsLocationにタッチ座標がそのまま入ってくる。 (ptsLocationについては全て共通でタッチ座標が入ってると思われる) 画面をスライドさせたい場合などは前のGID_PANとの差分を取って処理するなど。
・GID_SCROLLの処理 こっちがちょっと複雑でptsLocationは最終のタッチ座標。 残りのデータはullArgumentsに纏めて入っている。 分解するためのマクロが定義されているのでこれを使う。 GID_SCROLL_ANGLE(ullArguments)はスライドした方向を取得できる。 GID_ROTATE_ANGLE_FROM_ARGUMENTでラジアンに変換できる。 GID_SCROLL_DIRECTION(ullArguments)はARG_SCROLL_XXXの概ねの方向を取得。 GID_SCROLL_VELOCITY(ullArguments)はフリックの速さを取得。 4方向のどれかで良いのならDIRECTION、斜めも必要ならANGLEを使う。 慣性スクロールなどが必要であればVELOCITYを使って処理する。 離したあともメッセージが続くということはないのでタイマーなどが必要。
また前後にWM_LBUTTONDOWN、WM_LBUTTONUPがあることの注意すること。 GID_PANでスクロールなどさせると意図せず範囲選択になってしまったりする。 この場合、タップ処理はGID_SELECTで処理すると良い。 ただし全てWM_GESTUREで処理してしまうと選択処理が出来なくなったりする。 選択が必要なアプリケーションでは、スクロール用のWM_GESTURE処理と 選択用の従来処理を切り替えられるようにする事を検討する。 なお、GID_SELECTは離してから来る。(即ちWM_LBUTTONUP直前)
GID_HOLD、GID_DOUBLESELECTでも先にGID_SELECTが来るので 切り分ける必要がある場合タイムアウト処理が必要なのはサンプルの通り。
|