CREATESTRUCT

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つのウィンドウが表示
2つのウィンドウが表示

2つのウィンドウが表示。
Window1を閉じると、

WM_DESTROYのウィンドウ名表示にWindow1と出る
WM_DESTROYのウィンドウ名表示にWindow1と出る

WM_DESTROYのウィンドウ名表示にWindow1と出る。

今度はWindow2を閉じる
今度はWindow2を閉じる

最初からやり直して、今度はWindow2を閉じる。

Window2が出る
Window2が出る

Window2が出る。

それぞれのウィンドウごとに、CWindowオブジェクトを割り当てて、内部の状態も独立して別に持てるし、ウィンドウプロシージャも別々にすることができそう。

Sample/winapi/CREATESTRUCT/CREATESTRUCT/src/CREATESTRUCT at master · bg1bgst333/Sample · GitHub