トップページ > 過去ログ > 記事閲覧
マルチタッチについて
名前:トム 日時: 2010/07/28 23:23

マルチタッチに関する質問です。いろいろと調べたのですがわからないので誰か教えてください。 タッチした2点の座標をとりたいのですが、どのようなコードを書けばいいのかわかりません。 (OSはWindows7。ゲーム本体はDXライブラリを使って開発。) 実現するためには、VisualStudio2008とDXライブラリーとマルチタッチ対応ディスプレイ以外に何か必要でしょうか?

Page: 1 |

Re: マルチタッチについて ( No.1 )
名前:トム 日時:2010/07/31 09:43

自己レスです。 ・Windows SDK 7.0が必要? ・WM_TOUCHMOVEなどのメッセージを利用? このあたりに詳しい方教えてください。
Re: マルチタッチについて ( No.2 )
名前:管理人 日時:2010/08/03 09:02

マルチタッチ、面白そうなのでデバイスが安価で手に入るなら試してみようと思ったのですが 価格よりも置き場所の問題で購入できませんでした orz マルチタッチ機能を使うプログラムを作成する場合は、トムさんがお察しの通り Windows SDK 7 が 必要ですが、Visual C++ 2010 Express Edition なら Visual C++ 2010 Express Edition を インストールする際に一緒に Windows SDK 7 もインストールされるみたいですので、 Visual Studio 2008 でマルチタッチのプログラムを組むための環境を用意するより Visual C++ 2010 を 使用した方がお手軽かもしれません 今のところDXライブラリはマルチタッチに関する機能はありませんので、現時点でDXライブラリを 使いつつマルチタッチも、という場合は WM_TOUCHMOVE などのメッセージを処理する必要があります マルチタッチ機能の使い方に関する解説は WM_TOUCH で検索するといくつか出てきますので、 探してみてください 基本的に WM_TOUCH 系のメッセージからマルチタッチに関する情報を得ることになりますが、 DXライブラリは WM_ 系のメッセージをライブラリ内部で処理してしまっています なので、DXライブラリを使いつつウインドウに飛んでくるメッセージの一部を自前で 処理したい場合は、メッセージを処理する関数を SetHookWinProc 関数で登録します こちらにDXライブラリを使いながらマウスクリックのウインドウメッセージが飛んできたら 画面に四角形を表示するプログラムを組んでみましたので よろしければご覧になってみてください #include "DxLib.h" // マウスのボタンが押されたかどうかを記録するための変数 int MouseClick ; // フック用ウインドウプロージャ // WM_TOUCH 系の情報取得もここで行ってください LRESULT CALLBACK WndProc( HWND WindowHandle, UINT Message, WPARAM wParam, LPARAM lParam ) { // メッセージによって分岐 switch( Message ) { // マウスのどれかのボタンが押されたら「押されたフラグ」用の変数を1にする case WM_LBUTTONDOWN : case WM_RBUTTONDOWN : case WM_MBUTTONDOWN : MouseClick = 1 ; break ; } return 0; } // WinMain 関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモード ChangeWindowMode( TRUE ) ; // フック用ウインドウプロージャの登録 SetHookWinProc( WndProc ) ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // 描画先を裏画面に SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面クリア ClearDrawScreen() ; // マウスのボタンが押されていたら四角形を描画する if( MouseClick == 1 ) { // 四角形を描画 DrawBox( 0, 0, 128, 128, GetColor( 255,255,255 ), TRUE ) ; // フラグを倒す MouseClick = 0 ; } // メッセージの描画 DrawString( 0, 0, "画面をクリックすると一瞬だけ四角形が表示されます", GetColor( 255,255,255 ) ) ; // 裏画面の内容を表画面に ScreenFlip(); } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
Re: マルチタッチについて ( No.3 )
名前:トム 日時:2010/08/11 17:52

>こちらにDXライブラリを使いながらマウスクリックのウインドウメッセージが飛んできたら >画面に四角形を表示するプログラムを組んでみましたので >よろしければご覧になってみてください SetHookWinProc関数を使った管理人さんのプログラムが問題なく動作する事を確認しました。 どうもありがとうございます。 あとは、WM_TOUCHのメッセージを受け取れればいいのですが、 WM_TOUCHのメッセージを受け取るためには、RegisterTouchWindow(HWND hWnd, ULONG uFlags)を 呼ぶ必要がありそうです。 この関数の第一引数は、どこからGetすればいいのでしょうか? よろしくお願いします。
Re: マルチタッチについて ( No.4 )
名前:Cir 日時:2010/08/12 11:17

GetMainWindowHandle関数で取得できますよ。
Re: マルチタッチについて ( No.5 )
名前:管理人 日時:2010/08/13 08:50

既に Cirさんがご返答されていますが、GetMainWindowHandle() で RegisterTouchWindow の第一引数に 渡すべきウインドウハンドルを取得することができます
Re: マルチタッチについて ( No.6 )
名前:トム(解決) 日時:2010/08/16 00:36

>既に Cirさんがご返答されていますが、GetMainWindowHandle() で RegisterTouchWindow の第一引数に >渡すべきウインドウハンドルを取得することができます 管理人さん、Cirさん、どうもありがとうございました。 おかげさまで、問題なくWM_TOUCHのコールバックを受け取れるようになり、 同時にタッチした2点のそれぞれの座標を得る事ができるようになりました。 余談ですが、ベータの時は WM_TOUCHDOWN,WM_TOUCHUP,WM_TOUCHMOVEの3種類メッセージがあったようですが、 RC以降は WM_TOUCH 一つにまとめられているようです。

Page: 1 |