VC のWin32アプリケーション(単純なWin32アプリケーションを選択)で
SetTimer
TimerProc
の使い方を教えてください。
MFCの場合は
SetTimer(1,5000,NULL);
::OnTimer(UINT nIDEvent)
で5秒ごとの処理が簡単に作れますが、APIだとちょっとわかりません。
お願いします。
単純に5秒ごとにメッセージボックス"5秒たったよ"を数回表示するだけで
いいので使用例を教えてください。
*SetTimer命令後、終了してしまうのは困ります。
While(1)でループさせるとCPUに負担がかかります。
いい方法を教えてください。
数回メッセージボックスを表示語KillTimerをして終了するなど。
//プログラムの初期化時に(メッセージループに入る直前でいいと思います)
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は特に使わなくてもいいかな?と)
//的外れなこと言ってたらごめんなさい
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;
}
}
こんな感じでどうでしょうか?
ツイート | ![]() |