Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

9.1.2.1. Сходства между диалоговой функцией и оконной процедурой

1. Обе процедуры являются функциями обратного вызова и определяются с макросом CALLBACK.

2. Параметры для диалоговой функции и для обычной оконной процедуры одинаковы.

9.1.2.2. Различия между диалоговой функцией и оконной процедурой

1. Оконная процедура возвращает значение LRESULT, а диалоговая процедура – значение типа BOOL;

2. Если оконная процедура не обрабатывает сообщение, то она вызывает обработчик по умолчанию DefWindowProc(). Процедура диалога, если не обрабатывает сообщение, возвращает FALSE и TRUE – в противном случае.

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

4. Процедура диалога, как правило, не обрабатывает сообщения WM_PAINT и WM_DESTROY.

9.2. Типы диалоговых панелей

В Windows существуют два принципиально разных типа диалоговых окон: немодальные и модальные. Рассмотрим особенности модальных диалогов в первую очередь, поскольку они используются более часто.

9.3. Создание модального диалога

При выводе на экран модальной диалоговой панели работа приложения приостанавливается. Функции главного окна приложения и всех его дочерних окон перестают получать сообщения от мыши и клавиатуры. Все эти сообщения попадают в окно диалоговой панели. Когда работа с диалоговой панелью будет завершена, главное окно приложения и его дочерние окна будут вновь разблокированы.

Диалоговая панель не должна создаваться как дочернее окно. В этом случае она будет заблокирована наряду с остальными дочерними окнами. Для создания диалогов используется стиль временного окна.

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

Модальная диалоговая панель, тем не менее, позволяет пользователю переключиться на работу с другими приложениями. Если требуется запретить такую возможность переключения, это достигается использованием системных модальных диалоговых панелей, однако использовать это средство нужно с чрезвычайной осторожностью.

Итак, для создания модального диалога наиболее часто используется функция

int DialogBox(HINSTANCE hInst, LPCTSTR pTemplate, HWND hWndParent, DLGPROC pDlgFunc)

Эта функция создает диалоговое окно, используя ресурс шаблона pTemplate, и отображает эту панель как модальное диалоговое окно. Функция DialogBox() не возвращает управления до тех пор, пока диалоговое окно не будет закрыто пользователем. В точке вызова DialogBox() происходит блокировка окна, владеющего диалогом. Дескриптор этого окна передается через параметр hWndParent.

Не рекомендуется создавать модальные окна без владельца. Windows не разрушает и не скрывает таких диалоговых окон.