int WINAPI WinMain( ... ) { WNDCLASS wc; /* Our Window Class */ HWND hwnd; /* Handle of our window */ MSG msg; /* Message from the window system */ /* Set our class parameters */ wc.style = 0; : /* Register our window class */ if( !RegisterClass( &wc ) ) return 0; /* Create our window */ if( (hwnd = CreateWindow( ... )) == NULL ) return 0; /* Show and Update the window */ ShowWindow( hwnd, ... ); UpdateWindow( hwnd ); /* Start Message Loop */ while( GetMessage( &msg, ... ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } /* Return to the system */ return msg.wParam; }
Window Class の登録
アプリケーションが Window を作るに当たっては、まず Window Class の登録を
行う必要があります。これは資源を節約する為の手段で、構造体 WNDCLASS
を設定して、RegisterClass() 関数を呼び出すことにより行います。
一つの Window Class に対し登録は一回行うだけです。
Windows 3.1 の時代は、同じアプリケーションプログラムであれば、システムに
対し一つだけ登録することになっていました。つまり、ユーザが同じアプリケー
ションを二つ起動したら、二番目に起動された方は、登録を行わないことに
なっていました。この区別を行うのが、WinMain() に渡される引数の
二番目にある hPrevInstance です。これが NULL の時が、
最初に起動された場合で、この時にのみ登録作業を行うことになっていました。
Windows 95 や Windows NT では、プロセス空間は独立しているので、上に述べた
条件は消えて、常に(一度だけ)登録します。(hPrevInstance は
常に NULL になっています。)
Message Loop
上のプログラムリストの後半にある while() 文は、Message Loop と
呼ばれるもので、Windows Message がここで処理されます。GetMessage()
を呼び出した時点で、制御は Windows System に返されます。この Window への
Message が発生すると(例えば、この Window がクリックされたとか、別の
Window で隠されたとか)、System は、この Window のメッセージ待ち行列に
そのメッセージを加え、適当な時点で、制御をアプリケーションプログラム側へ
戻します。
アプリケーションプログラム側から見ると、この時点で GetMessage()
から戻ってきます。通常 GetMessage() の戻り値は非零で、この戻り値が
零になる(つまりwhile() 文から抜ける)のは終了メッセージ
(WM_QUIT)の時です。