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

ObjeqtNote #2 ウィンドウのクラス化

一気にウィンドウのクラス化を進める・・・。

f:id:BG1:20161026103159p:plain

ファイルを追加・・・。

f:id:BG1:20161026103224p:plain

Window.hから追加・・・。

ウィンドウマップ、staticなRegisterClassにウィンドウプロシージャ、Createはいろんな指定ができるようにとりあえず3つ・・・。
ダイナミックウィンドウプロシージャ、ハンドラはとりあえずOnCreateとOnDestroyだけ・・・。
ただし、ハンドラは純粋仮想関数なので、実装は派生クラスで定義する・・・。

f:id:BG1:20161026104532p:plain

VS2015だと緑波線でこれを選択して、

f:id:BG1:20161026104617p:plain

勝手にWindow.cppを追加して、定義を作ってくれるので便利・・・。

CWindow::m_mapWindowMapはstaticなので、cpp側にも宣言が要る・・・。

RegisterClassではウィンドウプロシージャはStaticWindowProcとしている・・・。

StaticWindowProcでは、m_mapWindowMapでhwndからCWindowオブジェクトポインタを取得し、それのDynamicWindowProcを呼ぶ・・・。
あとは、

DynamicWindowProcがハンドラに振り分け・・・。
OnCreateとOnDestroyの定義は派生クラスに・・・。

Createは3種類・・・。
位置とサイズを指定するもの、RECTを指定するもの、位置とサイズがお任せで親ウィンドウの場合のもの・・・。
ShowWindowはAPI呼んでるだけ・・・。

次にApplication.hを追加・・・。

メインウィンドウオブジェクトのポインタm_pMainWindowを持つ・・・。
InitInstanceは純粋仮想関数で派生クラスに・・・。
RunとExitInstanceを実装・・・。

Runはアイドル状態の処理のない、シンプルなメッセージループ・・・。
ExitInstanceではm_pMainWindow を解放・・・。

CWindowの派生クラス、CMainWindowには、

OnCreateとOnDestroyだけ・・・。

OnCreateは0を返すだけ・・・。
OnDestroyはPostQuitMessageするだけ・・・。

CApplicationの派生クラス、CMainApplicationは、

InitInstanceだけ・・・。

CWindow::RegisterClassでとりあえず"ObjeqtNote_MainWindow"というウィンドウクラスを登録・・・。

CMainWindowオブジェクトをm_pMainWindowに格納・・・。

m_pMainWindow->Createの省略版でサイズお任せのウィンドウを作成・・・。
m_pMainWindow->ShowWindowでウィンドウを表示・・・。

最後にWinMainは、

CMainApplicationを生成したら、InitInstanceを呼び、成功ならRun、失敗ならExitInstanceを呼ぶ・・・。
Runの中でメッセージループが終ったら、ExitInstanceを呼んでるのでRunの後は呼ばなくていい・・・。

f:id:BG1:20161026111648p:plain

サイズ任せで表示・・・。
ただ表示しているだけだが、内部はこうも変わっている・・・。

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