- ベストアンサー
OnTimer()時にクリックされたことを知るには?
環境 WIN98 VC++6.0 MFC にて OnTimer()時にクリックされたことを知るにはどうすれば良いですか? void CAbcdView::OnTimer(UINT nIDEvent) { KillTimer( 1 ); if ( どのように記述すれば良いですか?) //左クリックされたことを知りたい MessageBox( "クリックされました。", "左", MB_OK ); CView::OnTimer(nIDEvent); }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>OnTimer()時には簡単にメッセージが受け取れないのですね。 というか、OnTimerも、WM_TIMERというメッセージのハンドラです。 メッセージ処理の間には、他のメッセージは通常受け取れません。 メッセージキューの中に該当のメッセージが存在するかどうかを調べるのがPeekMessageになります。 なので、実は最初に上げられたソースのように、中身の 処理がほとんどないような状態だとPeekMessageでは 取れないと思ってください。 OnTimerがすぐに終了してしまいますから。 なので、#2の方のフラグを使う方法になります。 PeekMessage自体の使い方としては、メッセージキューに該当メッセージの有無のチェックです。 MSG msg; PeekMessage( &msg, *this, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE ); みたいにすれば、WM_LBUTTONDOWNがメッセージキューにあるかどうかを確認できます。
その他の回答 (4)
- BILLY-J
- ベストアンサー率57% (60/105)
こんにちは。 なるほど、1回目のクリックから一定時間内に2回目のクリックが 来たら「ダブルクリック」として扱うという事ですね。 最近GUI周りのコード書いてないので実装思い出せないのですが、 WM_LBUTTONDBLCLK でハンドリングするのではダメなのでしょうか。 その部分を自作したいという意図で有れば的はずれですね…
お礼
回答ありがとうございます。 今回は特に緊急の必要性がないので今後の参考にさせて頂きます。
- BILLY-J
- ベストアンサー率57% (60/105)
こんばんは。 #3さんが仰るように PeekMessage を使う方法だと、OnTimer を 処理している僅かなタイミングの間にキューに溜まったメッセージ、 或いは大量にメッセージが発生した状態でキューが渋滞し、偶然に WM_TIMER より後に積まれていたクリックしか検知できません。 私が挙げた方法だと、OnTimer が来るまでの間に処理された物に なり、どちらの時系列が欲しいのかによってロジックも変わって くると思います。 例えばタイマーを2周回す構造にして、1周目~2周目間で発生した クリックかどうかを2周目の OnTimer でチェックする、または1周目 の OnTimer でフラグを立て2周目 OnTimer ではフラグリセット、 OnClick 側で1周目のフラグをチェックして処理分岐… とすれば、2周目で処理するメッセージは過去のメッセージですが 1周目から見れば未来のクリックを処理する訳で…って詭弁ですね。 しかも結局フラグ制御だなぁ(苦笑) フラグ制御以外となると、少々強引ですが、一定間隔でループする スレッドを作りタイマーに見立てるのは如何? CWinThread で作ればメッセージキューを持っているので、OnClick でスレッドに対して PostThreadMessage すれば似たような動きを 実装できるかも知れません。
お礼
回答有難うございます。 #3のお礼欄に書いたことが今回の質問のきっかけです。 元々そう難しくないと思って質問しましたが、私にとっては思ったより厄介でした。
- BILLY-J
- ベストアンサー率57% (60/105)
タイマー周期の間に、クリックが発生したか、と言う事でしょうか? でしたら OnClick でフラグを立てておくようにし、OnTimer で そのフラグをチェック&クリア、という方法はどうでしょう。
お礼
回答ありがとうございます。 フラグの方法に付いては問題無く出来ました。 今回は、フラグを使わないで実現する方法が知りたくて質問しました。 でも、私が思っていたより面倒そうですね。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
PeekMessage() http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_peekmessage.asp
お礼
回答有難うございます。 OnTimer()時には簡単にメッセージが受け取れないのですね。 そんなことも知らずに質問してしまいました。 PeekMessage()について調べましたが、いつものように良く分かりませんでした。 とりあえず、すぐに知りたい訳ではないのでおいおい調べていきます。
お礼
回答ありがとうございます。 SDKでダブルクリックとシングルクリックを区別する方法として、質問のようなコードがあったのが質問のきっかけです。 http://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip1d.htm 思っていたより難しかったので、今回はPeekMessage関数というものの存在を知るに留めたいと思います。 whileでの長い時間がかかる処理中にメッセージを受け取るために使ったりするようですね。 #3の関数の使い方は、1例として大変良く分かりました。