2

使用 MFC,我创建了一个对话框,其中包含 5 个单选按钮。我想在选择其他单选按钮时收到通知。

现在,只要单击任何单选按钮,我都会收到通知。但是只有当单选按钮发生变化时,我才需要收到这些通知。

ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)

谢谢

4

5 回答 5

4

如果我正确理解您的问题,您想知道某个特定单选按钮 ( IDC_RADIO1) 的选中状态何时发生变化。

然后将此状态作为成员变量存储在您的对话框类中。 int m_radio1Checked;根据需要在构造函数中初始化为 0 或 1,并SetCheckRadioButton()OnInitDialog().

然后处理消息映射中每个单选按钮的单击:

ON_BN_CLICKED(IDC_RADIO1, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO2, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO3, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO4, &CMyDlg::OnRadioButtonClicked)
ON_BN_CLICKED(IDC_RADIO5, &CMyDlg::OnRadioButtonClicked)

并在处理程序中检查更改。

void CMyDlg::OnRadioButtonClicked()
{
  int oldState = m_radio1Checked;
  int newState = GetDlgItem(IDC_RADIO1)->GetChecked();
  m_radio1Checked = newState;
  if (oldState != newState)
    // do something ...
}
于 2012-06-05T10:48:53.813 回答
3

可以使用 ON_CONTROL_RANGE(BN_CLICKED, firstctrlid, lastcntrlid, memberfx)

于 2013-06-17T09:27:40.857 回答
2

每个单选按钮都有一个单独的消息映射,但有一个私有方法,所有这些都调用以检查所选单选按钮是否已更改。

void CDlg::OnRadioBtn1Clicked()
{
    if (!RadioSelectionChanged())
    return;

    //Add other code here
}

//Returns true if the selected radio button has changed
Boolean CDlg::RadioSelectionChanged()
{
    int previousBtnSelected = m_selectedRadioButton;
    UpdateData();

    if (previousBtnSelected != m_selectedRadioButton)
        return true;

    else
        return false;
}
于 2013-06-27T16:57:49.583 回答
2

首先创建所有单选按钮组。使用向导添加整数类型的成员变量。在通用处理程序中调用 UpdateData() 并检查变量的值。它应该设置为组中按钮的值(从零开始),从组中的第一个按钮为 0 开始。确保按钮以连续的 Z 顺序(tab 顺序)设置。

于 2012-06-06T23:09:32.380 回答
1

我想最简单的方法是将当前按钮状态(bool)存储为对话框类的成员变量(每个按钮一个),然后在 OnRadioButtonClicked 中检查状态是否已更改。

如果您需要在多个地方执行此操作,您可以创建自己的 CButton 派生类来封装此功能。

于 2012-06-05T10:47:03.283 回答