dポイントプレゼントキャンペーン実施中!

例えばクライアント領域に対し、
左シングルクリックと左ダブルクリックを両方使えるようにするにはどうすれば良いのでしょうか?

左シングルクリック時

処理シングル


左ダブルクリック時

処理ダブル


このような場合、ダブルクリック時に処理ダブルの前に処理シングルが走ると思うのですが、処理シングルが走らないようにするには、タイマーで一工夫などの処理を追加する必要があるのでしょうか?

また、そもそもシングルクリックとダブルクリックの両方が使えるようにすることが仕様的に変なのでしょうか?

A 回答 (4件)

やっぱりタイマーでしょうね。



http://www.hidecnet.ne.jp/~sinzan/tips/win/win_t …


>>こういうことは一般的にはやらないのでしょうか?
>一般的にはやりません。

ごく普通にやります。

タスクトレイのアイコンなんてみんな使ってます。
Windows標準でも、ボリュームやハードウェアの取り外しとか。

というか、エクスプローラでファイルをクリックしたとき、
シングル→選択
選択時にシングル→名前変更
ダブル→開く
って動作しますよね。


>ダブルクリックとシングルクリックの操作を間違える
>可能性を考慮すれば、処理がまったく別なものにすることは
>インターフェース的に優しくないと思います。

たとえば、
シングル→メニューを出す
ダブル→デフォルトの動作をする

これってタスクトレイのアイコンだとあたりまえの動作のような気がするのですが。そんなことないですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

これで出来ました。
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);
}

お礼日時:2004/03/30 20:12

taka_tetsuさんのURLみました。


わざわざスレッドをたてる必要なんてあれませんね。
KillTimerを見事に使った方法、
脱帽ですm(_ _)m
    • good
    • 0

ダブルクリック時にシングルクリックの処理が前もって


走るようにするのは一般的な方法です。
例えばwindowsのエクスプローラの場合
シングルクリックでファイルが選択され
ダブルクリックで実行します。
ダブルクリック時は必ず選択されます。

>こういうことは一般的にはやらないのでしょうか?
一般的にはやりません。

>また、実現するには時間差を読み取る方法が一般的なのでしょうか?
処理を別のスレッドにして
ダブルクリックかシングルクリックかのフラグをみるなりする以外
方法はないと思います。一般的ではありませんが、、

ダブルクリックとシングルクリックの操作を間違える
可能性を考慮すれば、処理がまったく別なものにすることは
インターフェース的に優しくないと思います。
    • good
    • 0
この回答へのお礼

大変良く分かりました。
回答ありがとうございました。

お礼日時:2004/03/27 20:57

ダブルクリック時にシングルクリックも


走ってしまうのはそれはWindowsの仕様です。

ダブルクリック時は
WM_LBUTTONDOWN(押した)→WM_LBUTTONUP(はずした)→WM_LBUTTONDBLCLK(ダブルクリック)→WM_LBUTTONUP(押した)
というメッセージがいきます。
処理を別のスレッドにして工夫すれば
ダブルクリック時シングルクリックの処理はしないようにできるかもしれませんが
時間差は読みとる必要がありますし、それなら
ウインドウクラス登録時、CS_DBLCLKSをはずしダブルクリックを検出しないようにしたほうが
良いでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

シングルクリックとダブルクリックの両方が使えるようにしたいのですが、

こういうことは一般的にはやらないのでしょうか?
また、実現するには時間差を読み取る方法が一般的なのでしょうか?

お礼日時:2004/03/27 20:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!