2012-06-05 5 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, как хотите, и используйте 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 ... 
} 
2

Сначала создать группу всех переключателей. Использование мастера добавляет переменную-член целочисленного типа. В общем вызове обработчика UpdateData() и проверьте значение переменной. Он должен быть установлен на значение кнопки в группе (основанной на нуле), начиная с ПЕРВОЙ КНОПКИ В ГРУППЕ КАК 0. Убедитесь, что кнопки установлены в последовательном порядке Z (порядок вкладок).

+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; 
} 
Смежные вопросы