MFC中的单选按钮选择更改

时间:2012-06-05 07:39:31

标签: mfc

使用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)

由于

5 个答案:

答案 0 :(得分: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 ...
}

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分: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;
}

答案 4 :(得分:1)

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

如果你需要在多个地方这样做,你可以创建自己的CButton派生类来封装这个功能。