Windowsコード集 | 上のページ |
通常、通知メッセージのディスパッチは1箇所で定義する事が通例です。 しかし以下のような関数にしてしまうと、DOSっぽいコーディングや重い処理を行う時に使えます。
下線部はアプリケーションによって異なります。 ここにはメインウィンドゥになるハンドルを置いておいてください。BOOL DoEvents() { MSG msg; if(PeekMessage(&msg,NULL,0,0)){ if(msg.message == WM_QUIT)return FALSE; TranslateMessage(&msg); DispatchMessage(&msg); } return (IsWindow(hwnd) != NULL); }
この関数の返り値がFALSEのときは、メインウィンドゥが破棄された事を示すので、呼び出し元では確実にアプリケーションを終了させるようにする必要があります。 例えば、こんな感じ。
そう大それた事でもなく、ただループの先頭にでも付けておけば良いです。BOOL LongLongFunction() { while(1){ if(!DoEvents())return FALSE; : : : } return TRUE; }
こうする事で、"中断ボタン"などの処理も可能になります。
また、こんな風に使う方法もあります。 ウィンドゥ生成後のメッセージループとして使ってしまいます。 私の場合DoEventsを更に改良して、周期動作の呼び出しなどにも利用させています(→タイマー動作あれこれ)。
int WINAPI WinMain(....) { // Window生成 : // メッセージ処理 while(DoEvents()){;} return 0; }
上のページ |