Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
43-70_otvety_na_teplogo.docx
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
88 Кб
Скачать
☆

67. Немодальное окно диалога. Функция создания окна. Обработка сообщений от немодальных окон диалога. Цикл обработки сообщений при наличии немодальных окон диалога.

Модальные окна диалога (исключая системные) позволяют пользователю переключаться между окнами диалога и другими программами. Однако, пользователь не может перейти в другое окно своей программы, пока не закроет модальное окно диалога. Немодальное окно диалога позволяет пользователю переключаться между окном диалога и окном, в котором оно было создано, а также между окном диалога и остальными программами. Таким образом, немодальное окно диалога больше напоминает обычные всплывающие окна, которые могут создаваться программой.

Немодальные окна диалога предпочтительнее в том случае, когда пользователь хотел бы на некоторое время оставить окно диалога на экране. Например, в программах обработки текстов немодальные окна диалога часто используются при поиске (Find) и замене (Replace). Если бы окно диалога Find было бы модальным, то пользователю пришлось бы выбрать в меню опцию Find, ввести искомую строку, закрыть окно, чтобы вернуться в документ, а затем при необходимости повторения поиска, снова воспроизвести весь этот процесс. Гораздо удобнее

дать пользователю возможность переключаться между документом и окном диалога.

Как уже известно, модальные окна диалога создаются с помощью функции DialogBox. Эта функция возвращает значение только после закрытия окна диалога.

Ее возвращаемым значением является второй параметр функции EndDialog, которая использовалась в процедуре окна диалога для его закрытия. Немодальные окна диалога

создаются с помощью функции CreateDialog. Параметры этой функции те же, что и параметры функции DialogBox:

hDlgModeless = CreateDialog(hInstance, szTemplate, hwndParent, DialogProc);

Отличие состоит в том, что функция CreateDialog сразу возвращает описатель окна диалога.

Функция CreateDialog напоминает функцию CreateWindow, с помощью которой создаются обычные окна.

Различия между модальными и немодальными окнами диалога

Работа с немодальными окнами диалога похожа на работу с модальными, но есть несколько важных отличий:

• Немодальные окна диалога обычно содержат строку заголовка и значок системного меню. Инструкция STYLE в шаблоне окна диалога для немодального окна диалога будет выглядеть примерно так: STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE

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

• Если без WS_VISIBLE, то после вызова функции CreateDialog необходимо вызвать функцию ShowWindow: hDlgModeless = CreateDialog(...); ShowWindow(hDlgModeless, SW_SHOW);

• Если сообщение предназначено для немодального окна диалога, то функция IsDialogMessage отправляет его оконной процедуре окна диалога и возвращает TRUE (ненулевое значение); в противном случае она возвращает FALSE (0). Функции TranslateMessage и DispatchMessage будут вызываться только в том случае, если hDlgModeless равен 0 или если сообщение не для окна диалога. Если для окна приложения используются быстрые клавиши, то цикл обработки сообщений должен стать таким:

while(GetMessage(&msg, NULL, 0, 0))

{

if(hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg))

{

if(!TranslateAccelerator(hwnd, hAccel, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

}

Поскольку глобальные переменные инициализируются нулем, hDlgModeless останется равной 0 до тех пор, пока окно диалога не будет создано; таким образом гарантируется, что функция IsDialogMessage не будет вызвана с недействительным описателем окна. При закрытии немодального окна диалога необходимо принять те же меры предосторожности.

Переменная hDlgModeless может использоваться и в других частях программы для проверки наличия на экране немодального окна диалога. Например, другие окна программы могут посылать окну диалога сообщения, пока hDlgModeless не равна 0.

Для закрытия немодального окна диалога, вместо функции EndDialog, используйте функцию

DestroyWindow. После вызова функции DestroyWindow глобальная переменная hDlgModeless должна быть установлена в 0.

По привычке, пользователь закрывает немодальное окно диалога используя опцию системного меню Close. Хотя опция Close разрешена, оконная процедура окна диалога внутри Windows не обрабатывает сообщения WM_CLOSE. Необходимо сделать это в процедуре диалога:

case WM_CLOSE:

DestroyWindow(hDlg);

hDlgModeless = 0;

break;

Обратите внимание на отличие между параметром hDlg функции DestroyWindow, передаваемым в процедуру диалога и параметром hDlgModeless — глобальной переменной, являющейся возвращаемым значением функции CreateDialog, которая проверяется внутри цикла обработки сообщений.

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

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