- ベストアンサー
左シングルクリックと左ダブルクリックを両方使えるようにするには?
例えばクライアント領域に対し、 左シングルクリックと左ダブルクリックを両方使えるようにするにはどうすれば良いのでしょうか? 左シングルクリック時 { 処理シングル } 左ダブルクリック時 { 処理ダブル } このような場合、ダブルクリック時に処理ダブルの前に処理シングルが走ると思うのですが、処理シングルが走らないようにするには、タイマーで一工夫などの処理を追加する必要があるのでしょうか? また、そもそもシングルクリックとダブルクリックの両方が使えるようにすることが仕様的に変なのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
やっぱりタイマーでしょうね。 http://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip1d.htm >>こういうことは一般的にはやらないのでしょうか? >一般的にはやりません。 ごく普通にやります。 タスクトレイのアイコンなんてみんな使ってます。 Windows標準でも、ボリュームやハードウェアの取り外しとか。 というか、エクスプローラでファイルをクリックしたとき、 シングル→選択 選択時にシングル→名前変更 ダブル→開く って動作しますよね。 >ダブルクリックとシングルクリックの操作を間違える >可能性を考慮すれば、処理がまったく別なものにすることは >インターフェース的に優しくないと思います。 たとえば、 シングル→メニューを出す ダブル→デフォルトの動作をする これってタスクトレイのアイコンだとあたりまえの動作のような気がするのですが。そんなことないですか?
その他の回答 (3)
- sha-girl
- ベストアンサー率52% (430/816)
taka_tetsuさんのURLみました。 わざわざスレッドをたてる必要なんてあれませんね。 KillTimerを見事に使った方法、 脱帽ですm(_ _)m
- sha-girl
- ベストアンサー率52% (430/816)
ダブルクリック時にシングルクリックの処理が前もって 走るようにするのは一般的な方法です。 例えばwindowsのエクスプローラの場合 シングルクリックでファイルが選択され ダブルクリックで実行します。 ダブルクリック時は必ず選択されます。 >こういうことは一般的にはやらないのでしょうか? 一般的にはやりません。 >また、実現するには時間差を読み取る方法が一般的なのでしょうか? 処理を別のスレッドにして ダブルクリックかシングルクリックかのフラグをみるなりする以外 方法はないと思います。一般的ではありませんが、、 ダブルクリックとシングルクリックの操作を間違える 可能性を考慮すれば、処理がまったく別なものにすることは インターフェース的に優しくないと思います。
お礼
大変良く分かりました。 回答ありがとうございました。
- sha-girl
- ベストアンサー率52% (430/816)
ダブルクリック時にシングルクリックも 走ってしまうのはそれはWindowsの仕様です。 ダブルクリック時は WM_LBUTTONDOWN(押した)→WM_LBUTTONUP(はずした)→WM_LBUTTONDBLCLK(ダブルクリック)→WM_LBUTTONUP(押した) というメッセージがいきます。 処理を別のスレッドにして工夫すれば ダブルクリック時シングルクリックの処理はしないようにできるかもしれませんが 時間差は読みとる必要がありますし、それなら ウインドウクラス登録時、CS_DBLCLKSをはずしダブルクリックを検出しないようにしたほうが 良いでしょう。
お礼
回答ありがとうございます。 シングルクリックとダブルクリックの両方が使えるようにしたいのですが、 こういうことは一般的にはやらないのでしょうか? また、実現するには時間差を読み取る方法が一般的なのでしょうか?
お礼
回答ありがとうございます。 これで出来ました。 LRESULT CSssView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください switch(message) { case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: SetTimer( message, GetDoubleClickTime(), NULL ); break; // ダブルクリック case WM_LBUTTONDBLCLK: KillTimer( WM_LBUTTONDOWN ); // 左のシングルクリックをキャンセル MessageBox( "ダブルクリックされました。", "左", MB_OK ); break; case WM_RBUTTONDBLCLK: KillTimer( WM_RBUTTONDOWN ); // 右のシングルクリックをキャンセル MessageBox( "ダブルクリックされました。", "右", MB_OK ); break; // シングルクリック case WM_TIMER: KillTimer( wParam ); if ( wParam == WM_LBUTTONDOWN ) MessageBox( "クリックされました。", "左", MB_OK ); if ( wParam == WM_RBUTTONDOWN ) MessageBox( "クリックされました。", "右", MB_OK ); break; } return CView::WindowProc(message, wParam, lParam); }