ダイアログ内に動的に表示したラジオボタンのイベント取得 – プログラミング – Home

ダイアログ内に動的に表示したラジオボタ...
 
通知
すべてクリア

[解決済] ダイアログ内に動的に表示したラジオボタンのイベント取得


小判ちゃん
 小判ちゃん
(@小判ちゃん)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

メインフレームからの引数(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)


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

ボタンのIDが一意であればメッセージマップを用意してあげれば
動的なコントロールでもイベントを処理できます。

たとえば、

ON_BN_CLICKED(1, OnButton1)
ON_BN_CLICKED(2, OnButton2)

のように。

>CButton* btn = new CButton[x]; //xはメインフレームからの引数です。
ですが、btnは誰かdeleteしてくれるのでしょうか?


返信引用
小判ちゃん
 小判ちゃん
(@小判ちゃん)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

Blueさん、回答ありがとうございます。

 >ボタンのIDが一意であればメッセージマップを用意してあげれば
 >動的なコントロールでもイベントを処理できます。

 >たとえば、

 >ON_BN_CLICKED(1, OnButton1)
 >ON_BN_CLICKED(2, OnButton2)

 >のように。

 今回、メインフレームからの引数(x)が、子ダイアログ立ち上げ時に渡されるわけですが、
 xの値が何になるか(何個ラジオボタンコントロールを作成するのか)子ダイアログ立ち上げ時
 に毎回変わってしまいます。
 上記のようにメッセージマップを用意する場合、ON_BN_CLICKED(ID, 処理関数)のID部をど
 のように記述すればよいのでしょうか。

 >ですが、btnは誰かdeleteしてくれるのでしょうか?
 btnはdeleteする予定でいます。

 よろしくお願い致します。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

作られるボタンの上限が決まっていれば、
(決まらないとなると、コントロールIDが他の何かにかぶる可能性が高くなるわけで・・・)

ON_CONTROL_RANGE

を使えば出来そうです。
(これなら関数1つで済むので)


返信引用
小判ちゃん
 小判ちゃん
(@小判ちゃん)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

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)' に変換できません。

何度もすみません。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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 のように &クラス名::メソッド名 という形式
で指定しないといけない)


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ON_CONTROL_RANGEに引き渡す関数の型が決まっているからです。
その点では、エラーメッセージは全く持ってその通りの内容になっています。

後、気になったんですが、

> CButton* btn = new CButton[x]; //xはメインフレームからの引数です。

これってメンバー変数か何かに保存してますか?
この記述だけ見ているとローカル変数に見えます。
ローカル変数ならその関数を抜けると変数が消滅するので
消すつもりのポインタが行方不明になって消せないと思います。


返信引用
小判ちゃん
 小判ちゃん
(@小判ちゃん)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

Blueさん、PATIOさん、早速の回答ありがとうございました。

お二人のご指摘通り、メンバ関数の型を変更してコンパイルしたところうまくいきました。
ご教授ありがとうございました。

>れってメンバー変数か何かに保存してますか?
>の記述だけ見ているとローカル変数に見えます。
>ーカル変数ならその関数を抜けると変数が消滅するので
>すつもりのポインタが行方不明になって消せないと思います。

おっしゃる通りです。とりあえずローカル変数にしていましたが、メンバ変数に変更しました。
ご教授ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました