アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境 WIN98 VC++6.0 MFC にて

OnTimer()時にクリックされたことを知るにはどうすれば良いですか?


void CAbcdView::OnTimer(UINT nIDEvent)
{
KillTimer( 1 );
if ( どのように記述すれば良いですか?) //左クリックされたことを知りたい
MessageBox( "クリックされました。", "左", MB_OK );
CView::OnTimer(nIDEvent);
}

A 回答 (5件)

>OnTimer()時には簡単にメッセージが受け取れないのですね。



というか、OnTimerも、WM_TIMERというメッセージのハンドラです。

メッセージ処理の間には、他のメッセージは通常受け取れません。

メッセージキューの中に該当のメッセージが存在するかどうかを調べるのがPeekMessageになります。

なので、実は最初に上げられたソースのように、中身の
処理がほとんどないような状態だとPeekMessageでは
取れないと思ってください。
OnTimerがすぐに終了してしまいますから。
なので、#2の方のフラグを使う方法になります。


PeekMessage自体の使い方としては、メッセージキューに該当メッセージの有無のチェックです。

MSG msg;
PeekMessage( &msg, *this, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE);

みたいにすれば、WM_LBUTTONDOWNがメッセージキューにあるかどうかを確認できます。
    • good
    • 0
この回答へのお礼

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

SDKでダブルクリックとシングルクリックを区別する方法として、質問のようなコードがあったのが質問のきっかけです。
http://www.hidecnet.ne.jp/~sinzan/tips/win/win_t …

思っていたより難しかったので、今回はPeekMessage関数というものの存在を知るに留めたいと思います。
whileでの長い時間がかかる処理中にメッセージを受け取るために使ったりするようですね。

#3の関数の使い方は、1例として大変良く分かりました。

お礼日時:2003/10/04 06:58

こんにちは。



なるほど、1回目のクリックから一定時間内に2回目のクリックが
来たら「ダブルクリック」として扱うという事ですね。

最近GUI周りのコード書いてないので実装思い出せないのですが、
WM_LBUTTONDBLCLK でハンドリングするのではダメなのでしょうか。
その部分を自作したいという意図で有れば的はずれですね…
    • good
    • 0
この回答へのお礼

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

今回は特に緊急の必要性がないので今後の参考にさせて頂きます。

お礼日時:2003/10/06 18:29

こんばんは。



#3さんが仰るように PeekMessage を使う方法だと、OnTimer を
処理している僅かなタイミングの間にキューに溜まったメッセージ、
或いは大量にメッセージが発生した状態でキューが渋滞し、偶然に
WM_TIMER より後に積まれていたクリックしか検知できません。

私が挙げた方法だと、OnTimer が来るまでの間に処理された物に
なり、どちらの時系列が欲しいのかによってロジックも変わって
くると思います。

例えばタイマーを2周回す構造にして、1周目~2周目間で発生した
クリックかどうかを2周目の OnTimer でチェックする、または1周目
の OnTimer でフラグを立て2周目 OnTimer ではフラグリセット、
OnClick 側で1周目のフラグをチェックして処理分岐…
とすれば、2周目で処理するメッセージは過去のメッセージですが
1周目から見れば未来のクリックを処理する訳で…って詭弁ですね。

しかも結局フラグ制御だなぁ(苦笑)


フラグ制御以外となると、少々強引ですが、一定間隔でループする
スレッドを作りタイマーに見立てるのは如何?
CWinThread で作ればメッセージキューを持っているので、OnClick
でスレッドに対して PostThreadMessage すれば似たような動きを
実装できるかも知れません。
    • good
    • 0
この回答へのお礼

回答有難うございます。

#3のお礼欄に書いたことが今回の質問のきっかけです。

元々そう難しくないと思って質問しましたが、私にとっては思ったより厄介でした。

お礼日時:2003/10/04 07:07

タイマー周期の間に、クリックが発生したか、と言う事でしょうか?



でしたら OnClick でフラグを立てておくようにし、OnTimer で
そのフラグをチェック&クリア、という方法はどうでしょう。
    • good
    • 0
この回答へのお礼

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

フラグの方法に付いては問題無く出来ました。

今回は、フラグを使わないで実現する方法が知りたくて質問しました。

でも、私が思っていたより面倒そうですね。

お礼日時:2003/10/03 19:12
    • good
    • 0
この回答へのお礼

回答有難うございます。

OnTimer()時には簡単にメッセージが受け取れないのですね。
そんなことも知らずに質問してしまいました。

PeekMessage()について調べましたが、いつものように良く分かりませんでした。

とりあえず、すぐに知りたい訳ではないのでおいおい調べていきます。

お礼日時:2003/10/03 19:08

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