C言語関係掲示板

過去ログ

No756 ダブルクリックの判定

[戻る] [ホームページ]
No.9406

ダブルクリック
投稿者---risa(2003/09/23 01:32:38)


はじめまして。
大学で、クリックをするたびに画像を変換して、ダブルクリックをしたら終了させるというような課題が出ました。
ダブルクリックをC言語で表すにはどうしたらよいのでしょうか?
ダブルクリックをあらわすような関数がC言語に存在するのでしょうか?

ちなみにマウス制御系の関数press(x,y)といものが既に用意されていて、これを用いると、画像をクリックしたとき、その点の座標値を取得することができます。

No.9409

Re:ダブルクリック
投稿者---みやび(2003/09/23 04:37:57)


>はじめまして。
>大学で、クリックをするたびに画像を変換して、ダブルクリックをしたら終了させるというような課題が出ました。
>ダブルクリックをC言語で表すにはどうしたらよいのでしょうか?
>ダブルクリックをあらわすような関数がC言語に存在するのでしょうか?
>ちなみにマウス制御系の関数press(x,y)といものが既に用意されていて、これを用いると、画像をクリックしたとき、その点の座標値を取得することができます。
>シングルクリックで取得できるなら条件決めてもう一度クリックされたら
ダブルクリックと判定するのではだめなのかなぁ。
同座標、n秒以内とか。同座標じゃなくても一度目の取得座標から許容する範囲内でn秒以内にもう一度とか。
やったことないので定石があるのかも知らんけどね。

No.9411

Re:ダブルクリック
投稿者---risa(2003/09/23 05:20:37)


>
>>シングルクリックで取得できるなら条件決めてもう一度クリックされたら
>ダブルクリックと判定するのではだめなのかなぁ。
>同座標、n秒以内とか。同座標じゃなくても一度目の取得座標から許容する範囲内でn秒以内にもう一度とか。
>やったことないので定石があるのかも知らんけどね。

私もそう考えたのですが、n秒以内という条件はC言語ではどのようにかけるのか検討も付かな有り様なのです (;;)
何秒以内であるか計ることのできる関数があるのでしょうか?

No.9412

Re:ダブルクリック
投稿者---YuO(2003/09/23 07:21:18)


>私もそう考えたのですが、n秒以内という条件はC言語ではどのようにかけるのか検討も付かな有り様なのです (;;)
>何秒以内であるか計ることのできる関数があるのでしょうか?

difftime関数を使えば可能です。

clock関数は,マルチプロセス環境下において,
自プロセスだけの実行時間を返す場合があり,使えないかもしれません。


No.9413

Re:ダブルクリック
投稿者---risa(2003/09/23 14:07:25)


時間の関数の情報ありがとうございました。自分なりに考えて早速使ってみたところ、

press(&x,&y); /*一回クリックされたら*/
/*時間を計る*/
time(&time1);
time(&time2);

if(difftime(time2,time1)<0.5){/*0.5秒以内の間*/
press(&x,&y); /*クリックがあったら*/
printf("終了します\n"); /*終了*/
break;
}else{ /*0.5秒間なにもなかったら*/
画像を変換する;
}

となりました。目的は、一回クリックしたらすぐに画像を変換して、ダブルクリックをしたらプログラムを終了することなのですが、
この場合、一回クリックしても、プログラムが次の2回目のクリックを待って画像を変換してくれません。どうしたらよいのでしょうか.
おそらくあほなことをやっているということはわかっていますが、よろしくお願いします。

No.9429

Re:ダブルクリック
投稿者---たいちう(2003/09/24 11:06:26)


press(x,y)が拾っているのはWM_LBUTTONDOWNのみなのか、
WM_LBUTTONDBLCLKも拾えるのかが不明です。

もしかしてpress(x,y)はクリックされるまで処理を返さないのでは?
だとすると、press(x,y)の後で前回からの経過時間を計算し、
終了すべきかどうかを判定します。前回のtimeの値を残しておいてください。

いずれにしても、

> /*時間を計る*/
> time(&time1);
> time(&time2);

これではクリック間の経過時間を計れません。
関数time()の処理の経過時間を計っています。

No.9436

Re:ダブルクリック
投稿者---risa(2003/09/24 20:10:46)


>press(x,y)が拾っているのはWM_LBUTTONDOWNのみなのか、
>WM_LBUTTONDBLCLKも拾えるのかが不明です。
>
WM_LBUTTONDOWNのみです。

>もしかしてpress(x,y)はクリックされるまで処理を返さないのでは?

はい。press(x,y)はクリックされるまで処理を返しません。
困ったことにpress(x,y)と書くと画像をクリックするまで次の段階に進めないので、ダブルクリックを認識しようとしてpress(x,y)を二回書くと、一回クリックしただけで画像を変換することができなくなるのです。もっと詳しく書くべきでした。すみません。

ご指摘ありがとうございます。ちょっとやってみますね。
環境はLinux で,emacs を使っています。

No.9427

Re:ダブルクリック
投稿者---nop(2003/09/24 10:16:51)


>ダブルクリックをC言語で表すにはどうしたらよいのでしょうか?
>ダブルクリックをあらわすような関数がC言語に存在するのでしょうか?

まず、ANSI C にはマウスを制御するような関数は用意されていない。
そして、マウスの制御などは環境によって変わってくる。

環境などは詳しく書きましょう。