Окт 16

Диалоговая процедура

Диалоговая процедура AboutDlgProc во многом напоминает оконную процедуру. Она должна иметь спецификатор CALLBACK, поскольку вызывается операционной системой. Имя функции может быть произвольным, однако сложилась традиция завершать это имя суффиксом DlgProc.
Функция AboutDlgProc принимает такой же набор параметров, что и обычная оконная процедура. Но некоторые различия между диалоговой процедурой и оконной процедурой все же есть:
Оконная процедура возвращает значение типа LRESULT, а диалоговая процедура — значение типа B00L.
Если оконная процедура не обрабатывает какое-то сообщение, то она вызывает DefWindowProc. Если диалоговая процедура не обрабатывает какое-то сообщение, то она возвращает значение FALSE. Если же сообщение обрабатывается диалоговой процедурой, то она возвращает значение TRUE.
Диалоговая процедура не обрабатывает сообщение WM_CREATE. Вместо этого она выполняет инициализацию при обработке специального сообщения WM_INITDIAL0G.
Диалоговая процедура обычно не обрабатывает сообщение WM_PAINT, так как все функции диалогового окна реализуются элементами управления. Сообщение WM_J.NITDJ.AL0G является первым сообщением, которое получает диалоговая процедура. Если после обработки этого сообщения процедура возвращает значение TRUE, то Windows помещает фокус ввода на первое дочернее окно элемента управления, которое имеет стиль WS_TABST0P. В разрабатываемом диалоговом окне первым элементом управления со стилем WS_TABST0P является кнопка ОК. В то же время при обработке сообщения WM_INITDIAL0G диалоговая процедура может использовать функцию SetFocus для того, чтобы установить фокус на какой-то другой элемент управления. Но тогда она должна вернуть значение FALSE.
Блок обработки сообщения WM_INITDIAL0G является самым удобным местом для инициализации элементов управления, если в этом есть необходимость.
Основным сообщением, обрабатываемым в диалоговой процедуре, является WM_COMMAND. Напомним, что если источником сообщения WM_COMMAND является элемент управления, то младшее слово параметра wParam содержит идентификатор элемента управления, старшее слово wParam содержит код уведомления, а параметр IParam — дескриптор элемента управления.
В нашей программе диалоговая процедура должна обрабатывать только два сообщения WM_COMMAND. Источником первого сообщения является кнопка ОК с идентификатором ID0K. Сообщение инициируется, когда пользователь щелкает на кнопке мышью или нажимает клавишу пробела или Enter.
Источником второго сообщения является кнопка закрытия диалогового окна, находящаяся в правой части его заголовка и имеющая идентификатор IDCANCEL. Это сообщение появляется, когда пользователь щелкает мышью на кнопке с крестиком или нажимает сочетание клавиш Alt+F4.
Обрабатывая оба эти сообщения, диалоговая процедура вызывает функцию EndDialog, после чего возвращает значение TRUE. Для всех остальных сообщений диалоговая процедура возвращает значение FALSE.
Функция EndDialog закрывает модальное диалоговое окно. Она имеет следующий прототип:
BOOL EndDialog ( HWND hDlg. // дескриптор диалогового окна
INT_PTR nResult // значение, возвращаемое из функции DialogBox
);
Второй параметр функции EndDialog задает значение, которое передается функции DialogBox (описываемой ниже) для использования в качестве кода возврата из функции DialogBox. Чаще всего функции EndDialog передается в параметре nResult значение TRUE при обработке команды ID0K и FALSE — при обработке команды IDCANCEL.
В программе DlgDemol код возврата функции DialogBox игнорируется, но на самом деле он может быть использован для проверки выбора, сделанного пользователем.