
プログラム初心者です。質問させてください!
現在私はWin32APIを用いて、簡単なプログラムを作成しています。
そこで例えばイベントAが起きた10秒後にあるアクション(1)をさせたくて、
WM_イベントAの時: SetTimer(hWnd,ID_MYTIMER1, 10000, NULL);
というようにプログラムを書きました。
そのSetTimer関数が実行されることより、
WM_TIMER:イベントが発生するので、WM_TIMER:イベントのところにあるアクション(1)をさせるプログラムを書きました。
しかし、イベントAが起きた100秒後には、あるアクション(1)とは違うあるアクション(2)をさせたいのですが、
この場合、WM_イベントAが起きたときに、
SetTimer(hWnd,ID_MYTIMER1, 10000, NULL);
SetTimer(hWnd,ID_MYTIMER2, 100000, NULL);
のようにプログラムをかいてしまうと、
二つともWM_TIMERイベントがおこるので、
あるアクション(1)も(2)も100秒後には実行されてしまいます。
100秒後にはアクション(1)はおこらず、アクション(2)だけおこる。
10秒後にはアクション(2)はおこらず、アクション(1)だけおこる。
このようにするには、どのようにすればいいのでしょうか?
アドバイスよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
wParam にタイマの識別子が入っていますので、それを利用して分岐処理してください。
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg){
case WM_TIMER:
switch(wParam){
case ID_MYTIMER1:
KillTimer(hWnd, ID_MYTIMER1);
// アクション(1)
break;
case ID_MYTIMER2:
KillTimer(hWnd, ID_MYTIMER2);
// アクション(2)
break;
}
break;
}
}
No.3
- 回答日時:
★別回答
・タイマー間隔は 10 秒にして、static なカウンタを用意します。
・WM_TIMER でカウンタが 10 回になったときだけ、アクション(2)を
それ以外は、アクション(1)を処理する。ってどう。
★サンプル
static LRESULT CALLBACK UserWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
static int nCount; ←先頭に記述。
switch ( uMsg ){
case WM_イベントAの時:
nCount = 0;
SetTimer( hWnd, ID_MYTIMER1, 10000, NULL );
break;
case WM_TIMER:
if ( ++nCount >= 10 ){
nCount = 0; ←リセット
アクション(2);
}
else{
アクション(1);
}
break;
Default:return( DefWindowProc(hWnd,uMsg,wParam,lParam) );
}
return( 0 );
}
最後に:
・上記の方法ならば、2回発生するタイマー処理の同期が取れますよ。
・タイマの識別子を比較して分岐する方法は同期を取るときに少し工夫がいります。
・また、WM_TIMER の部分をコールバック関数にして SetTimer の第4引数に渡すと
WM_TIMER ルーチンよりは、ほんの少しだけタイマー精度が上がります。
参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/w …
返事が遅くなり、大変申し訳ございません!
とても詳しいご回答、本当に感謝しております。
プログラミングって慣れるまでが大変ですが、いろいろなことができておもしろいですね!
頑張って私も早く熟練者になりたいです。ありがとうございました!
No.2
- 回答日時:
ウィンドウメッセージを処理するときに、
引き数の代わりとなるものは、基本的にwParamやlParamです。
この場合も同様のことが言えます。
WM_TIMERイベントが起こったときには、wParamにタイマーIDが格納されています。
このwParamをうまく使って(といってもただ比較するだけですが)がんばりましょう。
一応、WM_TIMERイベントの簡単な説明を見つけましたので、URLも参照するといいと思います。
参考URL:http://www.winapi-database.com/Message/WM/WM_TIM …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
"判定"の英語表現について
-
vba ListViewの選択色について...
-
X線CTにおけるコリメータの役割...
-
ENTERキーでフォーカスを移動し...
-
以前アクティブだったウィンド...
-
【至急】フォトショップの「自...
-
Outlookでメッセージの編集がで...
-
メッセージボックスを前面に表...
-
他の人には声だして挨拶してる...
-
C#でButtonのフォーカス枠を消...
-
SPREAD(GrapeCity)のセルにフォ...
-
Excelのマクロで実行時エラー”1...
-
どこにもフォーカスを当てたくない
-
MFCでコンボボックスを選択不可...
-
油性マジックで書いたサインを...
-
Chrome フォーカス時に枠が表示...
-
どういう意味
-
Accessの更新後処理で特定の条...
-
C# ReadOnlyのTextBoxで
-
コンボボックスの三角を一時的...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
"判定"の英語表現について
-
vba ListViewの選択色について...
-
DBマジック
-
For ~ Next の中での Dim宣言...
-
使用する言語(画像処理)
-
ActionScriptのコンパイル設定
-
以前アクティブだったウィンド...
-
Shellコマンドで別のexeを起動...
-
X線CTにおけるコリメータの役割...
-
SetTimer関数について。
-
FlashMediaServerを用いたライ...
-
大腿骨の骨梁
-
ソケット478でデュアルCPU ...
-
Wacomのタッチ機能が反応しませ...
-
客からクレームを受けました。 ...
-
プログラム中の大カッコについて
-
ビットマップの2値化
-
ペンタブIntuosのワイヤレス機...
-
flex bisonの導入方法
-
ロングレールの追加質問です
おすすめ情報