プログラムでの 流れ

[戻る]
namuko 2007/06/29(金) 17:10:19
以下のプログラム流れを教えて頂きたいのですが
PeekMessage()の0 が返った時の処理はいつ行われるか知りたいのですが
以下の流れで合ってるか教えてください。
よろしくお願いいたします。



1  CreateWindow();が呼び出された時
   WM_CREATEがメッセージキューに入り


2  GetMessage (&msg,NULL,0,0)で WM_CREATEを,MSG構造体に入れる


3  DispatchMessage()でWM_CREATEをウインドウプロシージャへ送る


4 ウインドウプロシージャでWM_CREATEが実行 while()の先頭に返る


5 PeekMessage()でWM_PAINTをキャッチ,GetMessage(),Dispatchを行う。


5 ウインドウプロシージャでWM_PAINTが実行 while()の先頭に返る


6 何のメッセージもない時初めてPeekMessage()が呼ばれる。




LRESULT CALLBACK WndProc() {

switch (msg) {
    case WM_CREATE:
    case WM_PAINT:
    }
return DefWindowProc(hWnd , msg , wp , lp);
}


int WINAPI WinMain(){

WNDCLASS設定
CreateWindow();


while (1) {

     if (PeekMessage (&msg,  NULL,  0,  0,  PM_NOREMOVE)) {

             if (!GetMessage (&msg,NULL,0,0))    
               return    msg.wParam ;

             TranslateMessage(&msg);
             DispatchMessage(&msg);

     } else{
                   /* 独自の処理 */

     }
}

wclrp ( 'o') [HomePage] 2007/06/29(金) 19:51:31
>PeekMessage()の0 が返った時の処理はいつ行われるか

知らん。
Windowsの仕様(改良により動作が変わるかもしれない)や、
そのときの負荷によって変わるんじゃないの。

俺はMFCつかうからWM_TIMERをつかう。

>1  CreateWindow();が呼び出された時
>   WM_CREATEがメッセージキューに入り
>3  DispatchMessage()でWM_CREATEをウインドウプロシージャへ送る

全てのメッセージがキューに入るわけではない。

ループの部分は説明するまでもないので略。

たいちう 2007/06/29(金) 21:01:41
> 2  GetMessage (&msg,NULL,0,0)で WM_CREATEを,MSG構造体に入れる

GetMessageが呼ばれる時には、WndProc()で、WM_CREATEの処理が終わっている。
(WM_CREATEより前の処理もある)


> PeekMessage()の0 が返った時の処理はいつ行われるか知りたいのですが
> 以下の流れで合ってるか教えてください。

いつ独自の処理が呼ばれるかということなら、
手が開いたときにいつでも、という理解で良いかと。
DirectX等のメッセージループがよくこういう形をしています。

ユーザーの入力やOSの都合などによるメッセージを優先的に処理して、
それらがない場合は、常に画面の更新を行う、とか。

namuko 2007/07/01(日) 23:26:23
お二方回答ありがとうございます!

WM_CREATEについて教えていただきありがとうございます。
解っているつもりでしたが,解ってないみたいですね。

どうもありがとうございました。

namuko 2007/07/01(日) 23:27:00
[[解決]]
解決

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