CREATESTRUCTは、CreateWindowによってWM_CREATEが呼ばれた時に、ウィンドウ作成情報を格納している構造体。
CREATESTRUCTA (winuser.h) - Win32 apps | Microsoft Docs
WM_CREATEのlParamは、CREATESTRUCTへのポインタにキャストでき、ウィンドウ作成情報が格納されている。
Window.hで、
ウィンドウ名m_wstrWindowNameを持ち、ウィンドウハンドルをキーとし、CWindowオブジェクトポインタを値とするマップm_mapWindowMapもある。
メンバのWindowProcにウィンドウメッセージ処理を書く。
Window.cppでは、
WM_DESTROYで、ウィンドウ名をメッセージボックス出力するぐらい。
あとはDefWindowProcに任せる。
CREATESTRUCT.cppで、
2つのウィンドウを作成する。
ウィンドウ名を"Window1", "Window2", とし、それぞれCWindowオブジェクトを作成し、そのポインタをCreateWindowの最後の引数に渡す。
WM_CREATEなら、lParamからlpCreateStructを取り出し、lpCreateStruct->lpCreateParamsで、CWindowオブジェクトポインタpWindowを取り出す。
pWindowは、ウィンドウ名m_wstrWindowNameも持っているので、そこにlpCreateStruct->lpszNameをセットする。
hwndをキー、pWindowを値として、ウィンドウマップに登録。
WM_CREATE以外なら、ウィンドウマップからpWindowを取得する。
pWindowが無い場合は、DefWindowProcを呼ぶ。
pWindowがある場合は、pWindow->WindowProcを呼ぶ。
2つのウィンドウが表示。
Window1を閉じると、
WM_DESTROYのウィンドウ名表示にWindow1と出る。
最初からやり直して、今度はWindow2を閉じる。
Window2が出る。
それぞれのウィンドウごとに、CWindowオブジェクトを割り当てて、内部の状態も独立して別に持てるし、ウィンドウプロシージャも別々にすることができそう。
Sample/winapi/CREATESTRUCT/CREATESTRUCT/src/CREATESTRUCT at master · bg1bgst333/Sample · GitHub