ユーザコントロールは独自のウィンドウクラスなのに対し、カスタムコントロールは既存のウィンドウクラスをベースにウィンドウプロシージャを差し替えて作る・・・。
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"なカスタムコントロールを作成・・・。
ユーザコントロールの右下にエディットコントロールベースなカスタムコントロール・・・。
エディットコントロールの機能を持っているので文字列を入力できる・・・。