Переключатель переключателя 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);
        }
    }
}
Другие вопросы по тегам