読者です 読者をやめる 読者になる 読者になる

Aoi #4 ダイナミックウィンドウプロシージャの導入

そろそろ、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はメニュー処理・・・。

f:id:BG1:20160628224255p:plain

見た目変わらないけど、中身はだいぶ変わった・・・。

https://github.com/bg1bgst333/Aoi/tree/develop/winapi/win32_blank/vs14/src/Aoi