メインフレームからの引数(x)によって、子ダイアログにx個のラジオボタンを作成し、ボタン
のイベントを取得したいと思っているのですが、どのような流れで作成すればよいのでしょう
か。
現在行っている方法は以下のようになっています。
CButton* btn = new CButton[x]; //xはメインフレームからの引数です。
for( int i = 0; i < x; ++i )
{
btn[i].Create( NULL, WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
rct, this, i + 1 );
}
//※コントロールIDは1から始まる連番にしています。
このような手順で、ラジオボタンの作成までは出来たのですが、ボタンのイベントをどのように
取得すればよいのかが分かりません。
MFCをはじめたばかりの為、恥ずかしいのですがあまりよく分かっていません。
誰か分かる方いらっしゃいましたら、ご教授ください。よろしくお願いします。
開発環境: Visual C++ 2005
OS: Windows2000(SP4)
ボタンのIDが一意であればメッセージマップを用意してあげれば
動的なコントロールでもイベントを処理できます。
たとえば、
ON_BN_CLICKED(1, OnButton1)
ON_BN_CLICKED(2, OnButton2)
のように。
>CButton* btn = new CButton[x]; //xはメインフレームからの引数です。
ですが、btnは誰かdeleteしてくれるのでしょうか?
Blueさん、回答ありがとうございます。
>ボタンのIDが一意であればメッセージマップを用意してあげれば
>動的なコントロールでもイベントを処理できます。
>たとえば、
>ON_BN_CLICKED(1, OnButton1)
>ON_BN_CLICKED(2, OnButton2)
>のように。
今回、メインフレームからの引数(x)が、子ダイアログ立ち上げ時に渡されるわけですが、
xの値が何になるか(何個ラジオボタンコントロールを作成するのか)子ダイアログ立ち上げ時
に毎回変わってしまいます。
上記のようにメッセージマップを用意する場合、ON_BN_CLICKED(ID, 処理関数)のID部をど
のように記述すればよいのでしょうか。
>ですが、btnは誰かdeleteしてくれるのでしょうか?
btnはdeleteする予定でいます。
よろしくお願い致します。
作られるボタンの上限が決まっていれば、
(決まらないとなると、コントロールIDが他の何かにかぶる可能性が高くなるわけで・・・)
ON_CONTROL_RANGE
を使えば出来そうです。
(これなら関数1つで済むので)
Blueさん、早速の回答ありがとうございます。
>ON_CONTROL_RANGE
>を使えば出来そうです。
>(これなら関数1つで済むので)
上記の方法で試してみました。
ON_CONTROL_RANGE(BN_CLICKED, 1, 3, OnRadio)
結果、下記のようなエラーが出力されうまくいきません。
何か使い方が間違っているのでしょうか??
error C2440: 'static_cast' : 'void (__thiscall CColorSetWin::* )(void)' か
ら 'void (__thiscall CCmdTarget::* )(UINT)' に変換できません。
何度もすみません。
ON_CONTROL_RANGEの関数はメンバ関数かつ型が決まっています。
宣言のほうでは
afx_msg void OnRadio(UINT nID);
とし、定義のほうは
ON_CONTROL_RANGE(BN_CLICKED, 1, 3, &CColorSetWin::OnRadio)
void CColorSetWin::OnRadio(UINT nID)
{
(略)
とします。
(VS2005の場合 &CColorSetWin::OnRadio のように &クラス名::メソッド名 という形式
で指定しないといけない)
ON_CONTROL_RANGEに引き渡す関数の型が決まっているからです。
その点では、エラーメッセージは全く持ってその通りの内容になっています。
後、気になったんですが、
> CButton* btn = new CButton[x]; //xはメインフレームからの引数です。
これってメンバー変数か何かに保存してますか?
この記述だけ見ているとローカル変数に見えます。
ローカル変数ならその関数を抜けると変数が消滅するので
消すつもりのポインタが行方不明になって消せないと思います。
Blueさん、PATIOさん、早速の回答ありがとうございました。
お二人のご指摘通り、メンバ関数の型を変更してコンパイルしたところうまくいきました。
ご教授ありがとうございました。
>れってメンバー変数か何かに保存してますか?
>の記述だけ見ているとローカル変数に見えます。
>ーカル変数ならその関数を抜けると変数が消滅するので
>すつもりのポインタが行方不明になって消せないと思います。
おっしゃる通りです。とりあえずローカル変数にしていましたが、メンバ変数に変更しました。
ご教授ありがとうございました。