« コントロールサイズのリサイズ |メイン| コントロールサイズのリサイズ その2 »

コントロールのサブクラス化と多重継承 | August 3, 2008 9:36 PM _ prgramming

/*
立て続けにまたプログラミングの記事。
いや、卒論(テキストの方ね)書くときに見返すことで役立つかなーと。
あとは何処かの誰かが同じようなことで詰まったときに少しでも参考になれば、と。
一応もそもそと絵を描いては居るのだけれど、どうにも身が入らない。
というか絵なんて描いていて良いのだろうかとか煽られる煽られる。
何かもう少しでも多くソース弄ってないと寝るときに不安が押し寄せてきて寝れないとか。
*/

そんなことはさておいて。
表題のことだけどサブクラス化と多重継承の説明は省略。
今回はサブクラス化と多重継承を行ったときに起きた問題と解決。

例えば、CWindowImplテンプレートを継承してサブクラス化する際に、更にCTreeViewCtrlExを継承する場合。
色々な関数が在るわけだけどCTreeViewCtrlEx::の関数を使う時にm_hWndがNULLですよーな意味のエラーががが。
んで、色々追ってみると、CWindow::m_hWndには値が入っていて、CTreeViewCtrlEx::m_hWndはNULLになっている。
CTreeViewCtrlEx::の関数を使うときは当たり前と言えば当たり前なんだけど、CTreeViewCtrlEx::m_hWndが使われる。
なのでCWindow::m_hWndの値をCTreeViewCtrlEx::m_hWndへ突っ込んでみると無事に動作確認!

けど動いたのは良いけどこんな解決の仕方で良いのだろうか。
ただまぁ色々なコントロールをクラス化して別で記述出来るので、分割してクラス当たりの行数を減らしてコーディングしたい人にはお勧め。
ただし何か問題があっても責任は取れな(ry

// 追記
m_hWndがNULLになるの件。
どうやらCDiagImplテンプレートの引数に二つ以上持たせることで解決できる模様。
宣言時に
public class CMyClass : public CDiagImpl<CMyClass , CTreeviewCtrlEx>
とかしてあげれば良いみたい。
これでわざわざ初期化関数を用意する必要が無くなる。

« コントロールサイズのリサイズ |メイン| コントロールサイズのリサイズ その2 »

Σ(・×・)