タイマーイベントに関して質問があります。
MFCでソフトを作っているのですが
今使われているタイマーイベントの生成は
SetTimer(10,1000,NULL); //1秒ごとにタイマーイベントを発生
となっています。ですがヘルプを見ると第一引数はハンドルで
タイマーを消滅させるときもそのハンドルを使うように書いています。
そこで
HWND timer;
SetTimer(timer,10,1000,NULL);
としてみたところ「不正な4つの引数・・・」と出てしまいました。
MFCで使われるSetTimerはSDKのものとは違うのでしょうか。
それとも何か単純な勘違いをしているのでしょうか
VC++6.0/MFC使用
困ったときにはまずMSDN。
UINT CWnd::SetTimer( UINT nIDEvent, UINT nElapse, void
(CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
UINT SetTimer(
HWND hWnd, // handle of window for timer messages
UINT nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);
ちがいますね。
あ。。見るところが違っていましたね・・
ありがとうございます。無事解決です。
SetTimer(10,1000,NULL);
KillTimer(10);
昔どこかで書いた記憶がありますが、
>タイマーを消滅させるときもそのハンドルを使うように書いています。
>SetTimer(10,1000,NULL);
>KillTimer(10);
厳密には、タイマーを消滅させる場合とOnTimerで使用するIDは、関数の戻り値を使うべきだ
と、MSDNに書いてあると思います。
ちょっと気になって読んでみたのですが、
MSDN(英語)のSetTimerの戻り値の解説には、次のように書いてあります。
(適当に訳してます)
| hWndがNULLの時、戻り値は新しいタイマーの識別子です。
| アプリケーションは、この値をKillTimerに渡してタイマー
| を停止させることができます。
|
| hWndがNULLでない場合、戻り値は非ゼロの整数です。
| アプリケーションは、nIDEventパラメータの値をKillTimer
| に渡してタイマーを停止させることができます。
hWndにNULL以外を指定した場合、戻り値をIDとして使っては
いけないような記述に読めますが、いかがでしょう?
dairygoodsさんのおっしゃる通りみたいですね・・(^^;
MSDNの ::SetTimer(英語)も確認しましたが確かにそのように書いてありました
---
CWnd::SetTimerで起動したタイマは、引数をそのまま使用して停止
CWnd::SetTimer( nIDEvent, ... );
CWnd::KillTimer( nIDEvent, ... );
::SetTimerで起動したウインドウに結びつくタイマも、引数をそのまま使用して停止
::SetTimer( hWnd, nIDEvent, ... );
::KillTimer( hWnd, nIDEvent, ... );
::SetTimerで起動したグローバルタイマは、戻り値を使用して停止
UINT nRetIDEvent = ::SetTimer( NULL, nIDEvent, ... );
::KillTimer( NULL, uRetIDEvent, ... );
----
以上が正しいようですね・・
日本語MSDNの変換ミスみたいですね・・・(汗
日本語版だけMSDN通りの仕様と言う可能性もありますが、
考えられませんね・・・
私がMSDNに騙されていた模様・・