2012-06-05 40 views
2

使用MFC我创建了一个有5个单选按钮的对话框。我希望在选中某个其他单选按钮时收到通知。MFC中的单选按钮选择更改

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

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) 

感谢

回答

1

我想做到这一点的最简单的方法是存储当前按钮的状态(布尔)作为对话框类(每个按钮)的成员变量,然后在OnRadioButtonClicked只是检查状态已经改变或没有改变。

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

4

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

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

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

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 ... 
} 
2

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

+0

感谢提示,以解决变量keep的值保持默认值通过调用UpdateData() –

3

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

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; 
}