そろそろ、CApplicationクラスとCWindowクラスに基本的な機能を残して、アプリ独自の機能をCMainApplicationクラスとCMainWindowクラスに移したいとおもう・・・。
CApplication::InitInstanceを純粋仮想関数にして、
新たに追加した派生クラスCMainApplicationのInitInstanceに中の処理を移す・・・。
RunとExitInstanceは、ひとまず基底クラスのCApplicationのものを呼ぶのでこれだけオーバーライド・・・。
WinMain.cppで、
CMainApplicationをnewしてpApplicationに格納することで、オーバーライドしたInitInstanceが呼ばれる・・・。
CMainApplicationのInitInstanceの中をよくみると、
CWindowをnewしていた部分もCMainWindowをnewするように変わっている・・・。
ここで、CWindow派生なオブジェクトごとに独自のウィンドウプロシージャを持つような仕組み(これをダイナミックウィンドウプロシージャと呼んでいるが。)を導入する・・・。
Window.hで、
m_mapWindowMapは、ウィンドウハンドルとCWindowオブジェクトポインタのペアを持つマップで、これですべてのCWindowオブジェクトを管理している・・・。
すべてのメッセージがWindowProcに飛ぶが、WM_CREATEの時はlpCreateStruct->lpCreateParamsからCWindowオブジェクトを取り出す・・・。
これは、
CreateWindowの最後に渡したthisがプロシージャに渡ってきたもの・・・。
これが取れたら、pWindowに入れておくとともに、hwndをキーにしてm_mapWindowMapに登録・・・。
それ以外のメッセージの場合は、
hwndをキーにm_mapWindowMapからオブジェクトを取り出してpWindowに・・・。
でpWindowが取得出来たら、
pWindow->DynamicWindowProcを呼ぶという仕組み・・・。
これでCWindow派生クラスごとに別々のDynamicWindowProcのオーバーライド関数が呼ばれるという仕組み・・・。
とはいえ、実際DynamicWindowProc自体は、
共通でよく、メッセージごとのOnCreate、OnDestroy、OnCommandをオーバーライドするほうがいい・・・。
というわけで、CMainWindowのOnCreateには、
メニューのセットをする部分を移行・・・。
OnDestroyは終了処理・・・。
OnCommandはメニュー処理・・・。
見た目変わらないけど、中身はだいぶ変わった・・・。
https://github.com/bg1bgst333/Aoi/tree/develop/winapi/win32_blank/vs14/src/Aoi