else
{
CheckDlgButton(hDlg.IDC_RADI03.BST_CHECKED): //EnableWindow(GetDlgItem(hDlg.HEIGHT).TRUE):
}
break;
case IDOK: //Ввод значений параметров перед закрытием диалога. UpdateData(hDlg): DestroyWindow(hDlg): return TRUE:
case IDCANCEL: // Выход без изменения параметров. RestoreParamO: UpdateImage(hDlg); return FALSE;
}
//Сюда процесс вычислений попадает при любых операциях в диалоговом окне
UpdateData(hDlg);
Updatelmage(hDlg); //Параметры обновляются
//Если эти два оператора закомментировать, возникнет синхронный режим работы break; }
return FALSE; }
Программа обеспечивает асинхронный режим обновления параметров. Изменение любого поля сразу же, без закрытия диалога, влечет за собой изменение соответствующего параметра. При нажатии кнопки Отказ диалоговое окно не закрывается сразу. В этом случае лишь восстанавливаются значения параметров, установленные до вызова диалога, позволяя пробовать другой вариант настройки.
При запуске данного проекта можно увидеть, что параметры обновляются слишком часто, по каждому сообщению WM_COMMAND. Окно класса edit посылает это сообщение не только при завершении ввода числа. При помощи этого сообщения диалоговой процедуре передаются извещения EN_SETFOCUS и EN_KILLFOCUS о получении и потере окном фокуса ввода, извещения EN_CHANGE и ENJJPDATE после ввода каждого нового символа и извещение EN_MAXTEXT, говорящее о том, что ввод строки прекращен.
Извещение EN_MAXTEXT может посылаться после нажатия клавиши Enter (при условии, что в свойствах поля редактирования взведены флаги стиля ES_MULTILINE и WANTRETURN) и после заполнения символами всего поля ввода (при условии, что не взведен флаг стиля ES_AUT0HSCR0LL).
Подобное поведение поля ввода приведет к тому, что колесо или высота текстовой области будет изменяться при вводе каждой новой цифры. Лучше вызывать обновление данных только при нажатии клавиши Enter или потере фокуса управляющим элементом, как это показано в листинге 8.8.
Применение переключателей Листинг 8.8
case WM_COMMAND: switch(LOWORD(wParam)) {
char s[80]: