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

ObjeqtNote #4 子ウィンドウの作成

子ウィンドウを作成し、追加する・・・。
今回は、ウィンドウをアイテムとするリストビューWindowListViewを自作して追加する・・・。

f:id:BG1:20161029153523p:plain

新しい項目で、

f:id:BG1:20161029153600p:plain

WindowListView.hを追加・・・。

子ウィンドウなのでリソースIDを定義・・・。
ハンドラOnCloseと、OnCloseとOnDestroyの間に子ウィンドウを破棄するDestroyを追加・・・。
また、子ウィンドウバージョンのCreateも追加・・・。

Createはウィンドウクラス名、ウィンドウ名、スタイルなどは固定・・・。
スタイルは、子ウィンドウで一応縦にスクロールができるように・・・。

Destroyでは、DestroyWindowで自身のウィンドウを破棄・・・。これの子ウィンドウはいないのでそれだけ・・・。

あとはこんな感じ・・・。
OnCloseは0を返している・・・。

Window.hで、

Destroyはもともとここに純粋仮想関数として追加・・・。
あと、OnCloseも追加・・・。
そして、OnCommandは純粋仮想関数はやめた・・・。

WM_CLOSEでOnCloseが0以外なら0を返す・・・。
そうすれば、閉じようとしても閉じないウィンドウになる・・・。
OnCloseが0なら、DefWindowProcが処理するのでウィンドウは閉じる仕掛け・・・。

OnCommandは基本的にFALSEを返しておく・・・。

MainWindow.hは、

CWindowListViewオブジェクトポインタm_pWindowListViewと、Destroy、OnCloseを追加・・・。

Destroyでは、m_pWindowListViewのDestroyを呼んで子ウィンドウを破棄した後、m_pWindowListViewを解放・・・。

OnCreateでCWindowListViewオブジェクトを作成して、Createでウィンドウ生成・・・。
親ウィンドウには、hwndを指定・・・。(この時点ではm_hWndはNULLのため・・・。)

OnCloseでDestroyすることで、OnDestroyより前に子ウィンドウを処理することができる・・・。

MainWindowのOnCommandだけメニューを呼び出すようになっている・・・。
それ以外は基本的にWindowクラスのOnCommandを呼び、そこではメニュー処理はされないような流れになる・・・。
これがOnCommandの純粋仮想関数化をやめた理由・・・。

あとはMainApplication.cppで、

WindowListViewのウィンドウクラス登録・・・。

f:id:BG1:20161029162441p:plain

スクロールバーしか見えないが、縦にスクロールできる子ウィンドウが表示されているのである・・・。

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