APIでSetTimerの使い方


Zak  2002-02-25 16:32:01  No: 50080  IP: [192.*.*.*]

VC のWin32アプリケーション(単純なWin32アプリケーションを選択)で
SetTimer
TimerProc
の使い方を教えてください。

MFCの場合は
SetTimer(1,5000,NULL);
::OnTimer(UINT nIDEvent) 
で5秒ごとの処理が簡単に作れますが、APIだとちょっとわかりません。
お願いします。

単純に5秒ごとにメッセージボックス"5秒たったよ"を数回表示するだけで
いいので使用例を教えてください。

*SetTimer命令後、終了してしまうのは困ります。
While(1)でループさせるとCPUに負担がかかります。
いい方法を教えてください。
数回メッセージボックスを表示語KillTimerをして終了するなど。

編集 削除
niUniU  2002-03-05 23:34:51  No: 50081  IP: [192.*.*.*]

//プログラムの初期化時に(メッセージループに入る直前でいいと思います)
SetTimer(hWnd, 100, 5000, NULL);
//hWndはタイマーを使いたいウィンドウのウィンドウハンドル
//第2引数はタイマーIDだけどタイマーが1つなら0以外の値でOK

//そうすると、指定時間毎にWM_TIMERというイベントが
//アプリケーションキューにポストされるのでこれをメッセージループで捕まえて

case WM_TIMER:
      MessageBox(NULL ,"5秒たったよ" ,"5秒たったよ" ,MB_OK);
break;

//そしてタイマーが必要なくなったら
KillTimer(hWnd, 100);
//としておけばいいと思うのですが

//こんな感じでどうでしょうか?(TimerProcは特に使わなくてもいいかな?と)
//的外れなこと言ってたらごめんなさい

編集 削除
ひろゆき  2002-03-06 00:01:17  No: 50082  IP: [192.*.*.*]

MFCと考え方は同じです
OnTimerをインプリメントする時に、クラスウィザードから、WM_TIMERを選択するとOnTimer関数が出来ると思いますが、MFCも32APIでもWindowsではWM_TIMERメッセージがポストされますのでSetTimerをしたウィンドウのプロシージャーでWM_TIMERメッセージを拾うようにしたらいいと思います。

たとえば
void TestTimerProc(hwnd,uMessage,wparam,lparam)
{
   switch(uMessage)
   {
   case WM_TIMER:
     *******処理省略**********
     if(タイマーをOFFにするか?)
      {
         KillTimer(hwnd,・・・・);

      }
       break;
    case WM_COMMAND:
      *******処理省略**********
      if(タイマーをONにするか?)
          SetTimer(hwnd,1,5000,NULL);
          //注意SetTimerの4番目の引数のNULLではなくをコールバック
            関数(TimerProc)を設定することもできますがここではややこしく
            なるので説明しません。
      break;
    }
}
こんな感じでどうでしょうか?

編集 削除