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

9.4. Закрытие модального диалога

Поскольку окно-владелец заблокировано во время работы модального диалога, единственно корректным способом уничтожения диалогового окна является саморазрушение в диалоговой процедуре, что достигается вызовом функции EndDialog().

if (nID == IDCANCEL) { EndDialog(hDlg, nID); return TRUE; }

Эта функция не только закрывает диалоговую панель, но и разблокирует вызывающую функцию DialogBox(), которая передает в приложение, в качестве возвращаемого значения, параметр nID функции EndDialog(). Как правило, диалог завершает работу при нажатии кнопки. Ее идентификатор nID и возвращается в представленном выше фрагменте кода. Следовательно, приложение может знать, при нажатии какой кнопки произошло закрытие модального диалога.

Заметим, что идентификаторы IDOK и IDCANCEL, которые определены в заголовочном файле windows.h, занимают особое место для модальных диалогов. Дело в том, что все диалоги снабжается кнопкой “Cancel” для того, чтобы пользователь смог отменить внесенные изменения. Итак, при нажатии на кнопку “Cancel” генерируется сообщение WM_COMMAND с идентификатором IDCANCEL, которое и поступает в функцию диалога. Эта же ситуация возникает тогда, когда пользователь нажмет клавишу Esc.

Все диалоги снабжается также кнопкой “Ok” для того, чтобы пользователь смог принять внесенные изменения. При нажатии на эту кнопку генерируется сообщение WM_COMMAND с идентификатором IDOK, которое поступает в функцию диалога. Обработчик этого сообщения должен иметь вид:

if (nID == IDOK) { // получить значения из элементов управления EndDialog(hDlg, nID); return TRUE; }

Кроме того, сообщение WM_COMMAND с идентификатором IDOK поступает и в том случае, если пользователь нажимает клавишу Enter в тот момент, когда выполняются одновременно два условия: 1) ни одна из кнопок, расположенных в диалоговой панели, не имеет фокус ввода; 2) ни одна из кнопок не имеет стиль WS_DEFPUSHBUTTON.

9.5. Окна сообщений.

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

Окно сообщения, с заголовком szCaption и выводимым текстом szText, создается с помощью функции MessageBox().

int MessageBox(HWND hWnd, LPCTSTR szText, LPCTSTR szCaption, UINT uType)

Как правило, параметром hWnd является дескриптор того окна –обычного или диалогового – которое создает окно сообщения. Если окно сообщения закрывается, то фокус ввода передается окну hWnd. Если дескриптор окна недоступен, или если приложению не нужно, чтобы фокус ввода получило одно из окон приложения, вместо этого дескриптора можно использовать значение NULL.

Четвертый параметр uType функции MessageBox() представляет собой набор битовых флагов.

Первая группа флагов указывает, какие кнопки будут отображены в окне сообщения, например, MB_OK, MB_OKCANCEL, MB_YESNO. Заметим, что окно сообщения может использовать максимум четыре кнопки.

Вторая группа флагов задает то, какая из этих четырех кнопок получит по умолчанию фокус ввода, например, MB_DEFBUTTONх, где х = 1..4.

Третья группа задает пиктограмму, которая появится в окне сообщения, например, MB_ICONINFIRMATION – информационный значок, MB_ICONWARNING – значок напоминания, MB_ICONSTOP – значок критической ошибки, MB_ICONQUESTION – значок запроса. Пиктограмма по умолчанию не задается.

В зависимости от нажатой кнопки, приводящей к удалению панели, окно сообщений возвращает один из следующих идентификаторов: IDOK, IDCANCEL, IDYES, IDNO, IDRETRY, IDIGNORE, IDABORT.