0

CDialog の CButton であるラジオ ボタンがあります。ユーザーがラジオ ボタンをクリックすると、関数OnClickedRadioButtonが呼び出されます。

内部OnClickedRadioButtonでは、この関数を呼び出してボタンを切り替えます。

void toggleButton(CButton& theButton)
{
    switch(theButton.GetCheck())
    {
        case BST_UNCHECKED:
        {
            theButton.SetCheck(BST_CHECKED);
            break;
        }
        case BST_CHECKED:
        {
            theButton.SetCheck(BST_UNCHECKED);
            break;
        }
        default:
        {
            theButton.SetCheck(BST_UNCHECKED);
        }
    }
}

プログラムをコンパイルして実行すると、(i)ラジオボタンがオンになっている場合は、クリックしてクリアできます。(ii) ラジオ ボタンがオフの場合、クリックしても何も起こりません。しかし、別のプログラム (Visual Studio など) をクリックしてから CDialog に戻ると、ラジオ ボタンがオンになります。

Cwnd::UpdateDialogControls関数とを見て試してみましたがCwnd::UpdateData、問題を解決するためにこれらを取得できませんでした。

4

1 に答える 1

0

この問題は、SetCheck が別の OnClickedRadioButton イベントを引き起こすという @rrirower のコメントに関連していると思います。

根本的な原因に関係なく、実装でラジオ ボタンを切り替えることができるようにするための簡単な修正は、ラジオ ボタンの Auto プロパティを False に設定することでしたBST_CHECKEDBST_UNCHECKED

これを行うには: 1) Visual Studio でリソースを開きます。 2) ラジオ ボタンを右クリックし、[プロパティ] を選択します。 3) [外観] セクションで、Auto プロパティを False に設定します。

CDialog のサブクラスで単一のラジオ ボタンを切り替えるための全体的なソリューションを次に示します (IDC_RADIO のラジオ ボタンを持つダイアログ リソースを既に追加していると仮定します)。

1) 次の行を配置して、ラジオ ボタン IDC_RADIO をメッセージ マップに追加します。

ON_BN_CLICKED(IDC_RADIO, OnBnClickedRadioButton)

BEGIN_MESSAGE_MAP と END_MESSAGE_MAP の間。

2) CDialog のサブクラスにハンドラー関数を追加します。

void OnBnClickedRadioButton()
{
    toggleButton(*(CButton*)GetDlgItem(IDC_RADIO));
}

3) トグル関数を CDialog のサブクラスに追加します

void toggleButton(CButton& theButton)
{
    switch(theButton.GetCheck())
    {
        case BST_UNCHECKED:
        {
            theButton.SetCheck(BST_CHECKED);
            break;
        }
        case BST_CHECKED:
        {
            theButton.SetCheck(BST_UNCHECKED);
            break;
        }
        default:
        {
            theButton.SetCheck(BST_UNCHECKED);
        }
    }
}
于 2015-01-13T18:43:01.593 に答える