Необходимо дважды вызвать сеттер для принудительного обновления графического интерфейса в MFC

0

Я использую элемент управления MFC ComboBox для изменения какого-либо параметра, который имеет избирательные группы в доступном диапазоне IP (только/нет широковещательного IP-адреса, например).

Мне нужно дважды вызвать функцию изменения диапазона, чтобы обновить показанные значения: почему?

Поведение:

Изображение 174551

                         One call to range modification

Изображение 174551

                         Two calls to range modification

Исходный код:

void CIPAddressBugDlg::OnChangeCombo()
{

    UpdateData(TRUE);
    ChangeIPRange();
    //ChangeIPRange();

}


void CIPAddressBugDlg::ChangeIPRange()
{
    BYTE nField0, nField1, nField2, nField3;

    if ( Combo.GetCurSel() )
    {
        IpAddress.GetAddress(nField0, nField1, nField2, nField3);
        if ( nField0  < (BYTE) 224 )
            nField0 = 224;
        IpAddress.SetAddress(nField0, nField1, nField2, nField3);
        IpAddress.SetFieldRange(0, 224 , 232 );
    }
    else
    {
        IpAddress.GetAddress(nField0, nField1, nField2, nField3);
        if ( nField0  >= (BYTE) 224 )
            nField0 = 223;
        IpAddress.SetAddress(nField0, nField1, nField2, nField3);
        IpAddress.SetFieldRange(0, 0 , 223 );
    }
}

Combo - это элемент управления ComboBox, а IpAddress - CIPAddressCtrl. Я компилирую на VS C++ 6.0 (да, я знаю -_-) под управлением Windows XP.

(При необходимости я могу загрузить весь проект игрушек)

Теги:
mfc
combobox

3 ответа

1
Лучший ответ

Попробуйте переместить SetFieldRange перед SetAddress иначе Windows будет игнорировать SetAddress потому что это вне диапазона.

  • 0
    Спасибо, вот почему это не сработало!
1

Это, наверное, так просто:

void CIPAddressBugDlg::OnChangeCombo()
{

    UpdateData(TRUE);
    ChangeIPRange();
    UpdateData(FALSE);
}

Изменения, внесенные в ChangeIPRange обновляются только после того, как вы вызываете UpdateData(FALSE).

1

Вы не обновляете значение в поле редактирования, пока второй раз не будет выполнен вызов UpdateData. Я не уверен, почему вы полагаетесь на UpdateData в OnChangeCombo, но это то, что вызывает обновление поля. Попробуйте удалить вызов UpdateData и добавьте вызов SetWindowText или эквивалентную команду диалога в ChangeIPRange(), чтобы обновить поле данных IP.

  • 0
    UpdateData здесь бесполезен (это была просто попытка увидеть, может ли это помочь). В любом случае, будучи неблокирующей причудой, я оставлю двойной вызов как есть, но было бы неплохо объяснить, почему он ведет себя так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню