使用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)
由于
答案 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派生类来封装这个功能。