ウィンドウプロシージャウィンドウプロシージャ・メッセージループ前回までは、ウインドウが生成された後、一瞬でウインドウが閉じてしまうアプリケーションでした。今回は、ウインドウ右上(タイトルバー右)の閉じるボタンを押して終了するようにします。メッセージループと、ウィンドウプロシージャというものを使用します。ユーザが終了処理をしない限り、このメッセージループから抜けないようにします。メッセージループについては、後述します。調べるループを持っています。このループをメッセージループと呼びます。メッセージは整数の値です。普通は、整数の値そのままで使わず、WM_から始まるシンボルを使います。「ウインドウ破棄のメッセージ」は、WM_DESTROYです。0x0002と定義されていますので、実際の値は2です。1.GetMessage()でメッセージを取得。(=0以外)を返します。WM_QUITメッセージを受けとれば、メッセージループから抜けて、アプリケーションが終了させます。メッセージに関する情報を管理する構造体です。*PMSG;MSG構造体の3つ目と4つ目のメンバの型、WPARAM、LPARAMは、ともにUINT_PTRであり、ポインタ型です。32ビットの環境の場合、32ビットのデータです。message)の付加情報です。「キーが押された」という情報だけですと、情報不足なので、足りない部分はWPARAM、LPARAMで補っています。メッセージによって、WPARAM、LPARAMに入る値は異なります。2.押されているキーボードの情報を、アプリケーションが取得できる形に変換してくれる関数TranslateMessage()を実行します。MSG構造体へのポインタ);3.取得したメッセージを、ウインドウプロシージャに送る処理をするDispatchMessage()を実行します。MSG構造体へのポインタ);4.WinMain()の戻り値を、MSG構造体のwParamパラメータにする。クラスWNDCLASSEX構造体のlpfnWndProcメンバを、後述のウィンドウプロシージャにします。これにより、メッセージの処理をウィンドウプロシージャで行います。WNDCLASS構造体は、ウィンドウクラスに関する情報を格納する構造体です。ウィンドウプロシージャウィンドウプロシージャとは、メッセージループで取得したメッセージを処理する関数です。ウィンドウプロシージャの名前は任意です。メッセージの付加情報(メッセージコードにより異なります));戻り値のLRESULTはLONG_PTR型、すなわちポインタ型のことです。CALLBACKは、呼び出し規約(スタックというメモリ領域の利用の仕方を決めたもの)です。__stdcallとLpmApi.hで定義されています。したがってCALLBACKは、__stdcallと同じ意味です。WINAPIも__stdcallと定義されていますので、同じ呼び出し規約です。CALLBACKをつけた関数は、コールバック関数と呼ばれますが、メッセージを処理する関数の場合は、ウィンドウプロシージャと呼ぶことが多いです。wParamと、lParamは、メッセージの付加情報です。2つ目の引数messageによって、何が入るかは変わってきます。1.ウィンドウプロシージャの2つめの引数messageによって、メッセージを判断します。このときに、PostQuitMessage()を実行して、ウインドウを閉じます。PostQuitMessage()を実行すると、WM_QUITメッセージを発生させます。これにより、メッセージループから抜け出すことができて、ウインドウを閉じることができるようになります。WM_QUITのwParamの値);3.ウィンドウプロシージャが処理しない部分では、デフォルトウィンドウプロシージャDefWindowProc()を実行アプリケーションが処理しないメッセージをDefWindowProc()に渡せば、Windows側で勝手に処理してくれます。DefWindowProc()を実行しないと、基本的なウィンドウの動作ができなくなります。メッセージの付加情報(引数Msgにより異なります));ソースコードの入力ソースコードは下記のように入れてください。ウィンドウを作成します。ウィンドウのメッセージを処理します。ウィンドウプロシージャ。