Создание немодального диалогового окна

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

В следующем примере приложение отображает немодальное диалоговое окно, если оно еще не отображено — когда пользователь выбирает команды перейти из меню приложений. Диалоговое окно содержит элемент управления edit, флажки и кнопки ОК и Отмена. Шаблон поля диалогового окна ресурс в исполняемый файл приложения и идентификатор ресурса DLG_GOTO. Пользователь вводит номер строки в поле редактирования и проверяет флажок, чтобы указать, что номер указан относительно текущей строки. Идентификаторы управления являются ID_LINE, ID_ABSREL, IDOK и IDCANCEL.

Операторы в первой части примера создать немодальное диалоговое. Эти заявления, в процедуре окна для главного окна приложения, создайте диалоговое окно "" когда Оконная процедура получает сообщения WM_COMMAND , имеющие идентификатор команды IDM_GOTO, но только если глобальной переменной hwndGoto еще не содержит допустимого дескриптора. Второй частью примера является приложения основной цикл обработки сообщений. Цикл включает в себя функцию IsDialogMessage чтобы убедиться, что пользователь может использовать интерфейс клавиатуры поля диалогового окна в этом безрежимном диалоговом. В третьей части примера содержится процедуру диалогового окна. Процедура извлекает содержимое элемента управления для редактирования и флажок, когда пользователь выбирает кнопку ОК. Процедура разрушает диалогового окна, когда пользователь выбирает кнопку Отмена.

HWND hwndGoto = NULL;  / / окно обработать диалогового окна. 
    . 
    . 
 
    дело WM_COMMAND: переключение (LOWORD(wParam)) {IDM_GOTO, дело: если (!IsWindow(hwndGoto)) {hwndGoto = CreateDialog (hinst, MAKEINTRESOURCE(DLG_GOTO), hwnd, GoToProc (DLGPROC)); 
                    ShowWindow (hwndGoto, SW_SHOW); 
                } 
                break; 
        } Возвращает 0 Л 
 

В предыдущих заявлениях, CreateDialog вызывается, только если не hwndGoto не содержит действительный дескриптор. Это гарантирует, что приложение не отображает два диалоговых окна в то же время. Для поддержки этого метода проверки, процедуру диалогового окна необходимо задать hwndGoto значение NULL, когда она разрушает диалогового окна.

Цикл обработки сообщений для приложения состоит из следующих операторов:

(GetMessage (amp; msg, NULL, значение NULL, значение NULL)) в то время как {если (!IsWindow(hwndGoto) || !IsDialogMessage (hwndGoto и msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 
 

Цикл проверяет истинность дескриптор окна для диалогового окна и только вызывает функцию IsDialogMessage если дескриптор действителен. IsDialogMessage только обрабатывает сообщение, если она принадлежит к диалоговому окну. В противном случае возвращается FALSE и цикла отправляет сообщение в соответствующие окна.

Следующие операторы определяют процедуру диалогового окна:

int iLine;             / / Получает строки номер BOOL fRelative;        / / Получает статус "флажок" BOOL обратного ВЫЗОВА GoToProc (HWND hwndDlg, UINT сообщение, WP&ARAM wParam, LPARAM lParam) {BOOL fError; 
 
    переключатель (сообщение) {WM_INITDIALOG, дело: CheckDlgButton (hwndDlg, ID_ABSREL, fRelative); 
            Возвращает значение TRUE; 
 
        дело WM_COMMAND: переключение (LOWORD(wParam)) {IDOK, дело: fRelative = IsDlgButtonChecked (hwndDlg, ID_ABSREL); 
                    iLine = GetDlgItemInt (hwndDlg, ID_LINE, amp; fError, fRelative); 
                    Если (fError) {MessageBox (hwndDlg, SZINVALIDNUMBER, SZGOTOERR, MB_OK); 
                        SendDlgItemMessage (hwndDlg, ID_LINE, EM_SETSEL, 0,-1 Л); 
                    } else / / уведомления владельца окна для перевозки / / out команды. 
 
                    Возвращает значение TRUE; 
 
                дело IDCANCEL: DestroyWindow(hwndDlg); 
                    hwndGoto = NULL; 
                    Возвращает значение TRUE; 
            }} Возвращает значение FALSE; 
} 
 

В предыдущих заявлениях процедура обрабатывает сообщения WM_INITDIALOG и WM_COMMAND . Во время обработки WM_INITDIALOG процедура инициализирует флажок, передав текущее значение глобальной переменной fRelative в CheckDlgButton. Процедура возвращает значение TRUE для руководства системы для установки фокуса ввода по умолчанию.

Во время обработки WM_COMMAND, процедура закрывает диалоговое окно, только если пользователь выберет «отмена» — то есть, имея IDCANCEL идентификатор кнопки. Процедура должна вызвать DestroyWindow для закрытия немодальное диалоговое окно. Обратите внимание на то, что процедура также устанавливает переменную hwndGoto для NULL для обеспечения правильной работы другие заявления, которые зависят от этой переменной.

Если пользователь выбирает кнопку ОК, процедура извлекает текущее состояние флажка и назначает его переменной fRelative . Переменная затем используется для получения номер строки из элемента управления для редактирования. GetDlgItemInt переводит текст в поле редактирования в целое число. Значение fRelative определяет ли функция интерпретирует число как значение знаком или без знака. Если текст элемента управления edit не является допустимым числом, GetDlgItemInt устанавливает значение переменной fError к нулю. Процедура проверяет это значение, чтобы определить, следует ли отображать сообщение об ошибке или выполнить команду. В случае возникновения ошибки процедуру диалогового окна посылает сообщение управления edit, направляя его для выделения текста в элементе управления таким образом, чтобы пользователь может легко заменить его. Если GetDlgItemInt не возвращает ошибку, процедуру можно выполнить запрошенную команду сам или отправить сообщение в окно владельца, направляя его для выполнения команды.

Index