Я использую элемент управления MFC ComboBox для изменения какого-либо параметра, который имеет избирательные группы в доступном диапазоне IP (только/нет широковещательного IP-адреса, например).
Мне нужно дважды вызвать функцию изменения диапазона, чтобы обновить показанные значения: почему?
One call to range modification
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.
(При необходимости я могу загрузить весь проект игрушек)
Попробуйте переместить SetFieldRange
перед SetAddress
иначе Windows будет игнорировать SetAddress
потому что это вне диапазона.
Это, наверное, так просто:
void CIPAddressBugDlg::OnChangeCombo()
{
UpdateData(TRUE);
ChangeIPRange();
UpdateData(FALSE);
}
Изменения, внесенные в ChangeIPRange
обновляются только после того, как вы вызываете UpdateData(FALSE)
.
Вы не обновляете значение в поле редактирования, пока второй раз не будет выполнен вызов UpdateData. Я не уверен, почему вы полагаетесь на UpdateData в OnChangeCombo, но это то, что вызывает обновление поля. Попробуйте удалить вызов UpdateData и добавьте вызов SetWindowText или эквивалентную команду диалога в ChangeIPRange(), чтобы обновить поле данных IP.