昨日の続きです。
ダイアログエディタでカスタムコントロールを設定し、そこのclass欄にカスタムウィンドウクラス?を記述すれば、ダイアログ生成時にCreateやSubclassWindowを使用せず自動的にWTLで実装したカスタムコントロールClassのインスタンスに結び付けられるかどうかを実験しています。
まず、そもそもこのエラーの意味がよくわからない、ATLでのウィンドウの管理手法がわかっていないので調べますと、詳しく解説しているページに出くわしました。
http://www.issei.org/diary/_20030224/d200104a.html#01-4
http://www.issei.org/diary/_20030224/d200104a.html#03-1
http://hp.vector.co.jp/authors/VA022575/coding/msgmap.html
イヤー凝ってますねー。WndProcの前でHWNDの内容をthisポインタに置き換えですか...。
それはさておき、昨日のエラーはAddCreateWndData()を呼んでいないため、StartWindowProcにThisポインタを渡せていなかったことが原因です。
カスタムコントロールのコンストラクタに下記のように実装することでエラーが出なくなりました。
GetWndClassInfo().Register(&m_pfnSuperWindowProc);しかし、これだとダイアログにカスタムコントロールを複数生成した場合、どのインスタンスに結び付けられるのかわからなくなってしまいます。
_AtlWinModule.AddCreateWndData(&m_thunk.cd,
this);
しかもm_hWndがセットされますので、SubclassWindowもできなくなります。
よくよく考えると、ダイアログが生成される前に、カスタムコントロールのウィンドウクラスが登録されていればよいだけなので、
- WndProcにAPIのDefWindowProcを指定
- DECLARE_WND_CLASSで設定したウィンドウクラスをAPIの::RegisterClassExで登録
しかし、所望の動作ではないですね。