Переключатель переключателя MFC задерживается
У меня есть переключатель, который является CButton в CDialog. Когда пользователь нажимает переключатель, функция OnClickedRadioButton
называется.
внутри OnClickedRadioButton
Я переключаю кнопку, вызывая эту функцию:
void toggleButton(CButton& theButton)
{
switch(theButton.GetCheck())
{
case BST_UNCHECKED:
{
theButton.SetCheck(BST_CHECKED);
break;
}
case BST_CHECKED:
{
theButton.SetCheck(BST_UNCHECKED);
break;
}
default:
{
theButton.SetCheck(BST_UNCHECKED);
}
}
}
Когда я компилирую и запускаю программу: (i) если переключатель включен, я могу щелкнуть его, чтобы очистить его. (ii) если переключатель не отмечен, я нажимаю на него, и ничего не происходит. Но если я нажимаю на другую программу (то есть на Visual Studio), а затем снова нажимаю на CDialog, включается переключатель.
Я посмотрел и попробовал функции Cwnd::UpdateDialogControls
а также Cwnd::UpdateData
, но я не смог получить их, чтобы решить мою проблему.
1 ответ
Я полагаю, что проблема была связана с комментарием @rrirower, что SetCheck вызовет другое событие OnClickedRadioButton.
Независимо от первопричины, быстрое решение, позволяющее моей реализации переключать переключатель междуBST_CHECKED
а также BST_UNCHECKED
должен был установить свойство Auto переключателя на False.
Для этого: 1) Откройте ресурс в Visual Studio. 2) Щелкните правой кнопкой мыши переключатель и выберите "Свойства". 3) В разделе "Внешний вид" установите для свойства "Авто" значение "Ложь".
Вот общее решение для переключения одной радиокнопки в подклассе CDialog (при условии, что вы уже добавили ресурс Dialog с радиокнопкой с ID IDC_RADIO):
1) Добавьте переключатель IDC_RADIO на карту сообщений, разместив эту строку
ON_BN_CLICKED(IDC_RADIO, OnBnClickedRadioButton)
между BEGIN_MESSAGE_MAP и END_MESSAGE_MAP.
2) Добавьте функцию-обработчик в ваш подкласс CDialog
void OnBnClickedRadioButton()
{
toggleButton(*(CButton*)GetDlgItem(IDC_RADIO));
}
3) Добавьте функцию переключения в ваш подкласс CDialog
void toggleButton(CButton& theButton)
{
switch(theButton.GetCheck())
{
case BST_UNCHECKED:
{
theButton.SetCheck(BST_CHECKED);
break;
}
case BST_CHECKED:
{
theButton.SetCheck(BST_UNCHECKED);
break;
}
default:
{
theButton.SetCheck(BST_UNCHECKED);
}
}
}