サブクラス化するためのクラスを作ろうと思って
作ってみたけど、途中で解決できなさそうな
問題に当たったので、結局作らずじまい。
どういう状態になっているのかというと、
まず、コンストラクタを以下のように定義。
CSubClass(HWND hSubClassWnd,bool (*WindowProc)(HWND,UINT,WPARAM,LPARAM));
で、自分が想定している使い方では、
ダイアログボックスを管理しているようなクラスのメンバに
サブクラス化した後に呼び出される関数のメンバを追加する。
そして、その関数をCSubClassの引数に与えて登録完了、っていう
手はずだったけど、これができず。以下のようなエラーが発生。
error C2276: & : 仮想関数のアドレスを取ろうとしました。
というのも、よくよく調べてみると、クラスのメンバ関数の
ポインタを宣言するには、
戻り値 (クラス名::*変数名)(引数)
というように、クラス名を明示してやらないと、無理なようなのです。
こうなってくるとどうしよもなくて、
template使ってできるかなぁ、とも思ったけど、これも多分無理。
抽象クラスを組んで、サブクラス化したときに呼び出される関数を
保持するクラス(上記なら、ダイアログボックスを管理しているクラス)が
それを継承してやれば、ごまかせそうな気もするけど、どうかなぁ。
まぁ、面倒なので、普通にサブクラス化して、そのサブクラス化した関数から
さらにstaticでは無いメンバ関数を呼び出して、その中で
記述を行う、という風にしときました。
さて、明日は補講か。。。