Custom Control

公開:2004-05-23 07:32
更新:2020-02-15 04:36
カテゴリ:psycle wtl,psycle,アプリ・ライブラリ・言語,windows,audio,tracker

昨日の続きです。

ダイアログエディタでカスタムコントロールを設定し、そこの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もできなくなります。
よくよく考えると、ダイアログが生成される前に、カスタムコントロールのウィンドウクラスが登録されていればよいだけなので、

しOnCreate時にインスタンスをSubclassWindowすればカスタムコントロールとインスタンスとを結びつけられます。要はスケルトンで生成し、後でカスタムコントロールクラスをくっつけるわけです。

しかし、所望の動作ではないですね。