Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ch-11.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.26 Mб
Скачать

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

Диалоговая процедура или процедура диалога программы обрабатывает сообщения, получаемые окном диалога. Хотя она очень сильно напоминает оконную процедуру, это не настоящая оконная процедура. Оконная процедура окна диалога находится в Windows. Эта оконная процедура вызывает вашу диалоговую процедуру, передавая ей многие из сообщений, которые получает сама. Здесь представлена процедура диалога программы ABOUT1:

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT iMsg,

WPARAM wParam, LPARAM lParam)

{

switch (iMsg)

{

case WM_INITDIALOG :

return TRUE ;

case WM_COMMAND :

switch (LOWORD (wParam))

{

case IDOK :

case IDCANCEL :

EndDialog (hDlg, 0) ;

return TRUE ;

}

break ;

}

return FALSE ;

}

Параметры этой функции те же, что и параметры обычной оконной процедуры; как и оконная процедура, процедура диалога должна быть определена как функция типа CALLBACK. Хотя в качестве описателя окна диалога использовался описатель hDlg, вместо него можно при желании использовать hwnd. Обратите внимание на отличия между этой функцией и оконной процедурой:

  • Оконная процедура возвращает значение типа LRESULT; а процедура диалогового окна — значение типа BOOL (определяемое в заголовочных файлах Windows как int).

  • Если оконная процедура не обрабатывает какое-то сообщение, она вызывает DefWindowProc; процедура диалога, если она не обрабатывает сообщение, возвращает FALSE (0), а если обрабатывает, то TRUE (ненулевое значение).

  • Процедура диалога не обрабатывает сообщения WM_PAINT и WM_DESTROY. Процедура диалога не получит сообщения WM_CREATE; вместо этого она выполняет инициализацию при обработке специального сообщения WM_INITDIALOG.

Сообщение WM_INITDIALOG является первым сообщением, которое получает процедура диалога. Это сообщение посылается только процедурам диалога. Если процедура диалога возвращает TRUE, то Windows помещает фокус ввода на первое дочернее окно элемента управления, которое имеет стиль WS_TABSTOP (о котором будет рассказано при изучении программы ABOUT2). В нашем окне диалога первым дочерним окном элемента управления, которое имеет стиль WS_TABSTOP, является кнопка. С другой стороны, при обработке сообщения WM_INITDIALOG процедура диалога может использовать функцию SetFocus для того, чтобы установить фокус на одно из дочерних окон управления окна диалога, и тогда она должна вернуть значение FALSE.

Единственным оставшимся сообщением, которое обрабатывает процедура окна диалога, является WM_COMMAND. Это то сообщение, которое элемент управления кнопка посылает своему родительскому окну тогда, когда либо на ней производится щелчок мышью, либо нажата клавиша <Spacebar> (пробел) и кнопка имеет фокус ввода. Идентификатор дочернего окна элемента управления (который в шаблоне окна диалога равен IDOK) находится в младшем слове параметра wParam. Для этого сообщения процедура диалога вызывает функцию EndDialog, которая сообщает Windows о необходимости закрытия окна диалога. Для всех остальных сообщений процедура диалога возвращает FALSE, сообщая оконной процедуре окна диалога внутри Windows, что процедура диалога программы не обрабатывает сообщение.

Сообщения для модального окна диалога не проходят через очередь сообщений программы, поэтому не беспокойтесь о влиянии быстрых клавиш на работу окна диалога.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]