Создание модального диалогового окна
Вы создаете модальное диалоговое окно, используя функцию DialogBox. Вы должны определить идентификатор или имя ресурса шаблона блока диалога и указателя на процедуру диалогового окна. Функция DialogBox загружает шаблон, показывает на экране диалоговое окно и обрабатывает весь ввод данных пользователем, пока пользователь не закроет блок диалога.
В следующем ниже примере, приложение показывает на экране модальное диалоговое окно тогда, когда пользователь щелкает по пункту Delete Item (Удалить элемент) в меню прикладной программы. Диалоговое окно содержит поле редактирования текста (в которое пользователь вводит имя элемента) и кнопки OK и Отменить (Cancel). Идентификаторы для этих органов управления - ID_ITEMNAME, IDOK и IDCANCEL, соответственно.
Первая часть примера состоит из операторов, которые создают модальное диалоговое окно. Эти операторы, в оконной процедуре для главного окна приложения, создают диалоговое окно, когда система получает сообщение WM_COMMAND, имеющее идентификатор меню IDM_DELETEITEM. Вторая часть примера - процедура диалогового окна, которые извлекает содержимое поля редактирования текста и закрывает блок диалога после получения сообщения WM_COMMAND.
Нижеследующие операторы создают модальное диалоговое окно. Шаблон блока диалога - ресурс в исполняемом файле приложения и имеет идентификатор ресурса DLG_DELETEITEM:
Пример
case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_DELETEITEM: if (DialogBox(hinst, MAKEINTRESOURCE(DLG_DELETEITEM), hwnd, (DLGPROC)DeleteItemProc)==IDOK) { // Завершите команду; szItemName содержит // имя удаляемого элемента. } else { // Команда отмены. } break; } return 0L; |
В этом примере прикладная программа определяет свое главное окно, как окно владельца блока диалога. Когда система вначале показывает на экране диалоговое окно, его расположение привязано к верхнему левому углу рабочей области окна владельца. Прикладная программа использует возвращаемое значение из DialogBox, чтобы установить, продолжать ли выполнение команды или прервать её работу. Ниже следующие операторы определяют процедуру диалогового окна.
Пример
char szItemName[80]; // получает имя удаляемого элемента. BOOL CALLBACK DeleteItemProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (!GetDlgItemText(hwndDlg, ID_ITEMNAME, szItemName, 80)) *szItemName=0; // Потерпели неудачу. case IDCANCEL: EndDialog(hwndDlg, wParam); return TRUE; } } return FALSE; } |
В этом примере, процедура использует функцию GetDlgItemText, чтобы извлечь текущий текст из поля редактирования текста, идентифицированного ID_ITEMNAME. Процедура затем вызывает функцию EndDialog, чтобы установить возвращаемое значение диалогового окна или в IDOK или в IDCANCEL, в зависимости от полученного сообщения, и начать процесс закрытия блока диалога. Идентификаторы IDOK и IDCANCEL соответствуют кнопкам OK и Отменить (Cancel). После того, как процедура вызовет EndDialog, система отправляет дополнительные сообщения процедуре, чтобы уничтожить диалоговое окно и возвращает обратно значение блока диалога в функцию, которая его создавала.