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

VizCommand #10 エディットコントロールのサブクラス化

エディットコントロールなどの既定のウィンドウクラスからなるウィンドウの場合、サブクラス化でウィンドウプロシージャを差し替えなければ、イベントを拾うことができない・・・。
CWindowを改修して、エディットコントロールのイベントを拾えるようにする・・・。

Window.hは、

UNICODEでビルドするかそうでないかでstd::wstringかstd::stringかを切り替え・・・。

m_mapBaseWndProcMapは、既定のウィンドウクラス名から既定のウィンドウプロシージャを引くマップ・・・。
これで既定の処理を任せるプロシージャを振り分ける・・・。

Createのオーバーロードメンバ関数を追加・・・。
プロシージャを差し替える場合は、bProcChangeにTRUEをセット・・・。

キーが押された時のOnKeyDownを追加・・・。

Window.cppは、

staticなのでこっちにもm_mapBaseWndProcMapの定義・・・。

StaticWindowProcは、pWindowがない場合にGetClassNameでhwndのウィンドウクラス名を取得し、m_mapBaseWndProcMapでウィンドウクラス名からウィンドウプロシージャを引いたら、みつかったらそのプロシージャをCallWindowProcに渡して処理させる・・・。
そうでないならDefWindowProc・・・。
そもそも、pWindowがある場合はpWindow->DynamicWindowProcに任せる・・・。

CreateではbProcChangeがTRUEの場合、OnCreateを呼び出してから、m_hWndのウィンドウプロシージャをGetWindowLongで取得し、代わりにSetWindowLongでStaticWindowProcをセットする・・・。これでm_hWndのイベントはStaticWindowProcに飛んでくる・・・。
(ウィンドウを作成してから差し替えるので、どうしてもWM_CREATEは飛んでこない・・・。そこで作成直後にOnCreateを呼んでいる・・・。)
m_mapBaseWndProcMapに指定したウィンドウクラスがなければ、取得したプロシージャとともにマップ登録・・・。
また、WM_CREATEを通らないのでウィンドウマップの登録もしておく・・・。

DynamicWindowProcでキーが押されたときのWM_KEYDOWNでOnKeyDownを呼ぶようにする・・・。

ここでもウィンドウクラス名があったら、CallWindowProcでみつかったプロシージャに任せる・・・。
でなければDefWindowProc・・・。

とりあえず、こちらのOnKeyDownは何もしない・・・。

Edit.hでOnKeyDownをオーバーライド・・・。

CEdit::CreateでWS_BORDERをつけてわかりやすく・・・。
そして、bProcChangeはTRUEに・・・。

OnKeyDownのwParamに押されたキーが入るので、リターン(VK_RETURN)ならメッセージボックスを出す・・・。

f:id:BG1:20161122190933p:plain

abcと入力・・・。
リターンキーを押すと、

f:id:BG1:20161122191020p:plain

メッセージボックスが表示された・・・。

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