タイマーイベント?

[戻る]
syo-san 2002/11/12(火) 15:31:34
タイマーイベントに関して質問があります。
MFCでソフトを作っているのですが
今使われているタイマーイベントの生成は
SetTimer(10,1000,NULL); //1秒ごとにタイマーイベントを発生
となっています。ですがヘルプを見ると第一引数はハンドルで
タイマーを消滅させるときもそのハンドルを使うように書いています。

そこで
HWND timer;
SetTimer(timer,10,1000,NULL);
としてみたところ「不正な4つの引数・・・」と出てしまいました。
MFCで使われるSetTimerはSDKのものとは違うのでしょうか。
それとも何か単純な勘違いをしているのでしょうか

VC++6.0/MFC使用

tib 2002/11/12(火) 15:34:38
困ったときにはまず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
);

ちがいますね。

syo-san 2002/11/12(火) 15:39:53
[[解決]]
あ。。見るところが違っていましたね・・
ありがとうございます。無事解決です。

SetTimer(10,1000,NULL);
KillTimer(10);

不良PG 2002/11/12(火) 16:01:11
昔どこかで書いた記憶がありますが、

>タイマーを消滅させるときもそのハンドルを使うように書いています。
>SetTimer(10,1000,NULL);
>KillTimer(10);

厳密には、タイマーを消滅させる場合とOnTimerで使用するIDは、関数の戻り値を使うべきだ
と、MSDNに書いてあると思います。

dairygoods 2002/11/12(火) 17:14:31
ちょっと気になって読んでみたのですが、
MSDN(英語)のSetTimerの戻り値の解説には、次のように書いてあります。
(適当に訳してます)

| hWndがNULLの時、戻り値は新しいタイマーの識別子です。
| アプリケーションは、この値をKillTimerに渡してタイマー
| を停止させることができます。
|
| hWndがNULLでない場合、戻り値は非ゼロの整数です。
| アプリケーションは、nIDEventパラメータの値をKillTimer
| に渡してタイマーを停止させることができます。


hWndにNULL以外を指定した場合、戻り値をIDとして使っては
いけないような記述に読めますが、いかがでしょう?

不良PG 2002/11/12(火) 17:44:44
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に騙されていた模様・・

古いスレッドには追加発言できません。