いつもお世話になります。
環境XP VC++6.0 MFC使用
ButtonWrapperというクラスを作成しました。
Genericクラスです。
CButton型のポインタをメンバに持っています。
Drawメソッドが呼ばれたら引数で渡されたウィンドウ
上にボタンを貼り付けます。
void ButtonWrapper::Draw( CWnd *pWnd )
{
m_pButton = new CButton;
CRect rect;
rect.left = 10;
rect.top = 10;
rect.right = 100;
rect.bottom = 100;
m_pButton->Create( Test, WS_VISIBLE | WS_CHILD
, rect, pWnd, 20000 );
}
呼び出し側は
m_buttonWrapper.Draw( this );
などとなります。
ここでボタンのクリックイベントを
ButtonWrapperクラスにてハンドルしたいのですが、
どの様に書けばよろしいでしょうか。
宜しくお願い致します。
ご回答ありがとうございます。
オーナードローにしないと不可能でしょうか。
ButtonWrapperクラスは事情があって、
CButtonの派生クラスにはしたくないのですが。
> オーナードローにしないと不可能でしょうか。
不可能ではないのかもしれないけど、、、
事情もわからない私にはアドバイスしにくいな。
他の回答者の役にも立つかもしれないので、
もう少しだけ質問。
1.
> Drawメソッドが呼ばれたら引数で渡されたウィンドウ
> 上にボタンを貼り付けます。
ウィンドウを詳しく説明してください。
(CDialogとか、CViewとか、任意のウィンドウとか)
2.
m_buttonWrapper.Draw( this ); の thisは何?
3.
ButtonWrapper::Drawは、一度しか呼ばれないんですよね?
そのタイミングは?
4.そもそもプロジェクトの種類は?
説明不足で申し訳ありませんでした。
1.CDialogです
2.CDialogです。(1.と同じ)
3.OnInitDialog()です。一度しか呼びません。
4.MFC AppWizard のダイアログベースです。
以上です。宜しくお願い致します。
クリックといったら親ウィンドウへ通知されるので
受け取ることは出来ないね。
マウスのボタンダウンとかなら受け取れるけど
クリックとは違うんだよな。
クリックはボタン上でボタンダウンして
そのボタン上でボタンを離したときに
親ウィンドウへWM_COMMANDメッセージとしてポストされるはず。
親ウィンドウに細工でもしない限り無理なんじゃないの。
Genericクラスでは、こんな方法しか無いのでは
CWndクラスにできれば、メッセージ転送でできるけど
CButton の派生クラスを作り
ButtonWrapperのポインターをメンバに追加
Click イベントで ButtonWrapperの関数を呼び出す
ButtonWrapper Drawで
CButton 派生クラスをnewする。自身のポインターも渡す。
私も他の人と同意見ですね。
Genericクラスだとそもそもメッセージを受け取る為の機構が中に無いわけだから
無理でしょう。それにButtonWrapperクラスはCButtonクラスではありませんし。
is aの関係ではなくて、have aの関係ですよね。
クリックイベントはボタンクラスがマウスボタンのイベントを受けて
親ウインドウに通知していると思うのでボタンクラスを弄らずに転送先を
変えるのは無理だと思います。
親ウインドウで受けておいて受けた内容をButtonWrapperクラスに通知するような
方法が一番確実ではないかと思います。
(通りすがりさんが書かれているようにクラスのメンバー関数を呼び出す形になるかと)
少なくとも親ウインドウの助けを借りないと無理なのではないでしょうか。
皆様、いろいろなアドバイスいただきありがとうございました。
通りすがり様の以下の方法でやってみたいと思います。
>ButtonWrapper Drawで
>CButton 派生クラスをnewする。自身のポインターも渡す。
すいません。解決しました。