MSDN ライブラリ>Windows 開発>C++ による Windows プログラミングの学習>モジュール 1. 初めての Windows プログラム>ウィンドウ プロシージャを記述する
https://msdn.microsoft.com/ja-jp/library/ff381408(v=vs.85).aspx
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
ウィンドウプロシージャには戻り値LRESULT と4つの引数があります。
hwnd:ウィンドウへのハンドル
uMsg:メッセージ コード。たとえば WM_SIZE メッセージはウィンドウのサイズが変更されたことを示す。
wParam,lParam:メッセージに関する追加情報,ポインターと同じサイズを持つを格納します。正確な意味はメッセージ コードごとに異なる。
LRESULT:プログラムが Windows に返す整数値、特定のメッセージに対するプログラムの応答。正確な意味はメッセージ コードごとに異なる。
wParam/lParamはポインターと同じサイズ(32bit OR 64bit)を持つ整数値で
通常、構造体のアドレスまたは数値です。
数値の場合、合計32bit以下の複数の値が格納されている場合がありその場合は
bit演算で各値を取り出す必要があります。
またあらかじめ値を取り出すためのマクロが用意されている場合があります
ウィンドウのサイズを変更したときに発生するメッセージWM_SIZE はLParamが16bit値二つでマクロそれぞれLOWORD()、HIWORD()、で取り出すことが出来ます。
全ての処理をウィンドウプロシージャに書くのはわかりにくいため必要なデータを取り出したら別の関数に渡すようにします。
メッセージを特に処理しない場合は既定の動作としDefWindowProc()関数を呼び出します。
LRESULT CALLBACK Form::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_SIZE: { int width = LOWORD(lParam); // 下位ワードを取得するマクロ int height = HIWORD(lParam); // 上位ワードを取得するマクロ // メッセージに応答: Form::OnSize(hwnd, (UINT)wParam, width, height); return 0; }; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } void Form::OnSize(HWND hwnd, unsigned int flag, int width, int height) { // ウィンドウサイズ変更時の処理 }
現状メッセージを処理するための関数がFormクラスがstatic関数にになっています。
どうにかして通常のメンバ関数にしたいと思います、
最初はstd::mapなどを用いて、ウィンドウハンドルとオブジェクトを関連付けようと思ったのですが、
専用のAPIがある様です、これについては後で解説します。