![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
例えばクライアント領域に対し、
左シングルクリックと左ダブルクリックを両方使えるようにするにはどうすれば良いのでしょうか?
左シングルクリック時
{
処理シングル
}
左ダブルクリック時
{
処理ダブル
}
このような場合、ダブルクリック時に処理ダブルの前に処理シングルが走ると思うのですが、処理シングルが走らないようにするには、タイマーで一工夫などの処理を追加する必要があるのでしょうか?
また、そもそもシングルクリックとダブルクリックの両方が使えるようにすることが仕様的に変なのでしょうか?
No.3ベストアンサー
- 回答日時:
やっぱりタイマーでしょうね。
http://www.hidecnet.ne.jp/~sinzan/tips/win/win_t …
>>こういうことは一般的にはやらないのでしょうか?
>一般的にはやりません。
ごく普通にやります。
タスクトレイのアイコンなんてみんな使ってます。
Windows標準でも、ボリュームやハードウェアの取り外しとか。
というか、エクスプローラでファイルをクリックしたとき、
シングル→選択
選択時にシングル→名前変更
ダブル→開く
って動作しますよね。
>ダブルクリックとシングルクリックの操作を間違える
>可能性を考慮すれば、処理がまったく別なものにすることは
>インターフェース的に優しくないと思います。
たとえば、
シングル→メニューを出す
ダブル→デフォルトの動作をする
これってタスクトレイのアイコンだとあたりまえの動作のような気がするのですが。そんなことないですか?
回答ありがとうございます。
これで出来ました。
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);
}
No.2
- 回答日時:
ダブルクリック時にシングルクリックの処理が前もって
走るようにするのは一般的な方法です。
例えばwindowsのエクスプローラの場合
シングルクリックでファイルが選択され
ダブルクリックで実行します。
ダブルクリック時は必ず選択されます。
>こういうことは一般的にはやらないのでしょうか?
一般的にはやりません。
>また、実現するには時間差を読み取る方法が一般的なのでしょうか?
処理を別のスレッドにして
ダブルクリックかシングルクリックかのフラグをみるなりする以外
方法はないと思います。一般的ではありませんが、、
ダブルクリックとシングルクリックの操作を間違える
可能性を考慮すれば、処理がまったく別なものにすることは
インターフェース的に優しくないと思います。
No.1
- 回答日時:
ダブルクリック時にシングルクリックも
走ってしまうのはそれはWindowsの仕様です。
ダブルクリック時は
WM_LBUTTONDOWN(押した)→WM_LBUTTONUP(はずした)→WM_LBUTTONDBLCLK(ダブルクリック)→WM_LBUTTONUP(押した)
というメッセージがいきます。
処理を別のスレッドにして工夫すれば
ダブルクリック時シングルクリックの処理はしないようにできるかもしれませんが
時間差は読みとる必要がありますし、それなら
ウインドウクラス登録時、CS_DBLCLKSをはずしダブルクリックを検出しないようにしたほうが
良いでしょう。
回答ありがとうございます。
シングルクリックとダブルクリックの両方が使えるようにしたいのですが、
こういうことは一般的にはやらないのでしょうか?
また、実現するには時間差を読み取る方法が一般的なのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
javascriptの中で、perlのコマ...
-
Excel VBAで行内にオートシェイ...
-
デジタル時計の時刻合わせの方...
-
マイページはどこを開くの
-
スクリプトって、何ですか?ど...
-
一定時間おきにアラームやポッ...
-
エクセルのシート上に別のシー...
-
Javascript_submit()完了後に処...
-
[Java] Edgeでのアドレスバー非...
-
Excelでワードアートや図を常に...
-
リトルバスターズEXを中古で購...
-
小さな表示窓の呼び方は
-
Youtubeが勝手に右下に勝手に小...
-
ウイルスバスターの契約更新に...
-
Excel操作 ウィンドウで出した...
-
Chromeは何で進むボタンが無いの?
-
どうして+3
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
excelのタスクバーアイコンが・...
-
Perlで数値(小数点、負の数、...
-
VB6.0のEnabledをfalseにしても...
-
処理終了後のに砂時計が、クリ...
-
C++での連続した左クリックの禁...
-
Perlの多重起動を禁止したい
-
【C#】ラベルのダブルクリック...
-
別ページからのタブ切り替えの...
-
マウスオーバー時に効果音を鳴らす
-
指定の時間が来たら、メールを...
-
実行時引数からの日付取得
-
javascriptの中で、perlのコマ...
-
VBAにてjavascriptを起動したい
-
VBAでIEの「Web ページからのメ...
-
エクセル アプリケーションの...
-
VB6にて、バックグラウンド処理...
-
C# マウスオーバーの記述方法
おすすめ情報