Обработка извещений
Когда пользователь нажимает кнопки OK, Cancel или Help, расположенные в нижней части окна блокнота или кнопки Back, Next или Finish, расположенные в нижней части окна органа управления Wizard, функция диалога текущей страницы получает сообщение WM_NOTIFY . Код извещения передается через поле code структуры NMHDR , адрес которой находится в параметре lParam сообщения WM_NOTIFY.
Для органов управленияPropery Sheet и Wizard определены следующие коды извещений:
Код извещения | Описание |
PSN_SETACTIVE | Это извещение передается функции диалога, когда активизируется соответствующая страница блокнота или органа управления Wizard. Обработчик извещения может выполнить все необходимые инициализирующие действия |
PSN_KILLACTIVE | Страница отодвигается на задний план или удаляется с экрана. Обработчик этого извещения может проверить введенные пользователем значения и если они неправильны, заблокировать переключение на другие страницы блокнота |
PSN_APPLY | Это извещение посылается когда пользователь нажимает кнопку OK или Apply |
PSN_HELP | Извещение PSN_HELP посылается когда пользователь нажимает кнопку Help |
PSN_QUERYCANCEL | Извещение PSN_QUERYCANCEL посылается когда пользователь нажимает кнопку Cancel, собираясь закрыть блокнот. Обработчик может запретить это действие, например, если пользователь не указал какие-либо необходимые параметры |
PSN_RESET | Это извещение посылается вслед за извещением PSN_QUERYCANCEL, если обработчик последнего не запретил закрытие блокнота |
PSN_WIZBACK | Посылается, когда пользователь нажал кнопку Back в органе управления Wizard |
PSN_WIZNEXT | Посылается, когда пользователь нажал кнопку Next в органе управления Wizard |
PSN_WIZFINISH | Посылается, когда пользователь нажал кнопку Finish в органе управления Wizard |
Обработчики извещений могут возвращать значение FALSE или TRUE, однако в большинстве случаев дополнительно необходимо устанавливать код завершения в структуре данных диалога с помощью функции SetWindowLong. При этом в качестве второго параметра для этой функции следует указать значение DWL_MSGRESULT.
В следующем фрагменте кода, который взят из приложения "Property Sheet Demo", проверяется длина строки szTempBuf. Если она больше 8, возвращается значение TRUE, а если меньше - FALSE:
if(lstrlen(szTempBuf) > 8) { SetWindowLong(hdlg, DWL_MSGRESULT, TRUE); return TRUE; } else { SetWindowLong(hdlg, DWL_MSGRESULT, FALSE); return FALSE; }
Более подробную информацию об использовании этих извещений вы сможете найти в справочной системе SDK. Самые нужные из них будут описаны в разделах "Приложение Property Sheet Demo" и "Wizard Demo".