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

ObjeqtNote #10 カスタムコントロールの定義

ユーザコントロールは独自のウィンドウクラスなのに対し、カスタムコントロールは既存のウィンドウクラスをベースにウィンドウプロシージャを差し替えて作る・・・。

f:id:BG1:20170125224517p:plain

CustomControl.hでは、

CWindowの派生クラスCCustomControlを定義・・・。
既定のウィンドウクラス名から既定のウィンドウプロシージャを引くm_mapBaseWindowProcMapを用意・・・。
独自にStaticWindowProcを持つ・・・。
コンストラクタ、Create、そしてDynamicWindowProcも・・・。

CustomControl.cppは、

Createでは、CreateWindowでウィンドウを作成・・・。
そのあと、OnCreateを呼ぶ・・・。
このウィンドウのプロシージャをGetWindowLongで取得、一旦lpfnWndProcに格納・・・。
SetWindowLongで、このクラスのStaticWindowProcを新しいプロシージャとしてセット・・・。
CCustomControl::m_mapBaseWindowProcMapにベースとなるウィンドウクラス名とlpfnWndProcのペアをセット・・・。
ウィンドウマップ登録もそのあとしておく・・・。

StaticWindowProcでは、pWindowがあった場合はpWindow->DynamicWindowProc、無かった場合でGetClassNameで取得したhwndのウィンドウクラス名がm_mapBaseWindowProcMapにあった場合はCallWindowProcでそのプロシージャに任せる・・・。無かったらDefWindowProc・・・。

DynamicWindowProcでは、各ウィンドウメッセージごとの処理・・・。
最後にウィンドウクラス名がm_mapBaseWindowProcMapにあった場合はまたCallWindowProc、なかった場合はDefWindowProc・・・。

StandardWindow.hでは、

m_pCustomControlを追加・・・。

StandardWindow.cppでは、

m_pCustomControlの初期化処理と解放処理を追加、そしてOnCreateでウィンドウクラス名"Edit"なカスタムコントロールを作成・・・。

f:id:BG1:20170125233459p:plain

ユーザコントロールの右下にエディットコントロールベースなカスタムコントロール・・・。

f:id:BG1:20170125233553p:plain

エディットコントロールの機能を持っているので文字列を入力できる・・・。

・カスタムコントロールの定義 · bg1bgst333/ObjeqtNote@deab613 · GitHub