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

S.F. Page

Programming,Music,etc...

Custom Control

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もできなくなります。
よくよく考えると、ダイアログが生成される前に、カスタムコントロールのウィンドウクラスが登録されていればよいだけなので、
  • WndProcにAPIのDefWindowProcを指定
  • DECLARE_WND_CLASSで設定したウィンドウクラスをAPIの::RegisterClassExで登録
しOnCreate時にインスタンスをSubclassWindowすればカスタムコントロールとインスタンスとを結びつけられます。要はスケルトンで生成し、後でカスタムコントロールクラスをくっつけるわけです。

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