9

2つのラジオボタンがあるMFCダイアログがあります。私はそれらを素敵なグループに入れました、それらのIDCは次々にあります(RB_LEFT, RB_RIGHT)。

DDX_Radio整数値を使用してボタンにアクセスできるように使用したいので、関数で次のDoDataExchangeように呼び出します。

DDX_Radio(pDX, RB_LEFT, mRBLeftRight);

ここで、はタイプmRBLeftRightのメンバー変数ですinteger。また、ボタンのプロパティを編集する必要があるため、を使用DDX_Controlしてメンバー変数にマップしmRBLeftmRBRightCButton):

DDX_Control(pDX, RB_LEFT, mRBLeft);
DDX_Control(pDX, RB_RIGHT, mRBRight);

ここで、を呼び出すとDDX_Control、が呼び出されるたびに、処理できないメッセージを強制的に処理するDoDataExchangeため、アプリケーションがクラッシュします。私が理解しているこの部分。DDX_ControlRB_LEFTDDX_Radio

私は使用せずDDX_Control(の呼び出しを削除)、クラスDoDataExchangeのラジオボタン()へのポインターを保持することにしました。CButton*したがって、私のOnInitDialog関数では、次の呼び出しを行います。

mRBLeft= ((CButton*)GetDlgItem(RB_LEFT));
mRBRight = ((CButton*)GetDlgItem(RB_RIGHT));

今、私が使用しない限り、それは問題ないmRBLeftでしょうが、私が使用する場合、バム、クラッシュしDoDataExchangeます。本当に困惑するのは、左 ((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true) のラジオボタンを使用して変更すると機能することです。すっごく違いは何ですか?

(私はそれが少しの面倒なことであることを知っています、しかし私はただメカニズムを理解したいです)

4

2 に答える 2

9

TBH JCの投稿よりもさらに簡単で、信じられます。

DDX_Control( pDX, IDC_RADIO3, m_r3 );
DDX_Control( pDX, IDC_RADIO4, m_r4 );

m_Val   = 0;
DDX_Radio( pDX, IDC_RADIO3, m_Val );

WS_GROUPグループの最初のラジオボタンを(この場合は)でマークする必要がありますIDC_RADIO3。これで準備が整い、自動的に)が選択されますIDC_RADIO3

最新の状態に保つm_Valには、グループ内のすべてのラジオボタンにクリックハンドラーを配置する価値があります。その関数内で、単純に、callUpdateData( TRUE ); m_Valはグループ内のラジオボタンのインデックスを指すようになります。

于 2009-07-22T14:59:48.880 に答える
3

私はここで答えを見つけました:http ://www.flounder.com/getdlgitem.htm

使用に問題がありDDX_ControlDDX_Radio同時に:)これは問題を回避するための小さなハックです。

ラジオボタン変数

Microsoftのある種の奇妙な哲学的観点を表す別の本質的な問題は、ラジオボタンの制御変数を作成することを許可してはならないということです。これは意味がありません。彼らは、ラジオボタンを操作する唯一の方法はインデックスを使用することであるという奇妙な考えを持っています。これは絶望的に不十分です。したがって、ラジオボタンの制御変数を取得するには、いくつかの深刻なゆがみを経験する必要があります。

最初に行う必要があるのは、戻ってすべてのラジオボタンにWS_GROUPスタイルがあることを示すことです。WS_GROUP制御変数を持つことができるのは、スタイルのあるラジオボタンだけです。ただし、それらすべてにをマークし WS_GROUP、制御変数を作成してから属性を削除すると WS_GROUP、すべてが正常に機能します。ありがとうございます。なぜこれらの追加の手順を実行する必要があるのか​​はまったく意味がありませんが、派生クラスの問題と同様に、私はこれについて何年も何の効果もなく不平を言ってきました。私の問題は、戻ってすべての属性を元に戻すのを忘れ続けることWS_GROUP です。そのため、この後初めてプログラムを実行すると、すべてのラジオボタンが1つのボタンのグループであることがわかります。おっと。$#%!修正し、再コンパイル/再リンクします。

于 2009-07-22T14:55:24.490 に答える