Рекомендации по программированию диалоговых окон

В этом обзоре рассматриваются некоторые аспекты программирования, касающиеся диалоговых окон.

Обзор содержит следующие разделы.

Процедуры диалогового окна

Процедура диалогового окна аналогична процедуре окна в том, что система отправляет сообщения в процедуру, когда она содержит сведения для предоставления или выполнения задач. В отличие от процедуры окна, процедура диалогового окна никогда не вызывает функцию DefWindowProc . Вместо этого он возвращает значение TRUE , если оно обрабатывает сообщение или FALSE , если оно не имеет значения.

Каждая процедура диалогового окна имеет следующую форму:

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
 
        // Place message cases here. 
 
        default: 
            return FALSE; 
    } 
}

Параметры процедуры служат той же цели, что и в процедуре окна, с параметром hwndDlg , получающим дескриптор окна диалогового окна.

Большинство процедур диалогового окна обрабатывают сообщение WM_INITDIALOG и сообщения WM_COMMAND, отправленные элементами управления, но обрабатывают мало других сообщений. Если процедура диалогового окна не обрабатывает сообщение, она должна вернуть значение FALSE , чтобы направить систему для внутренней обработки сообщений. Единственным исключением из этого правила является сообщение WM_INITDIALOG . Процедура диалогового окна должна вернуть значение TRUE , чтобы направить систему для дальнейшего обработки сообщения WM_INITDIALOG . В любом случае процедура не должна вызывать DefWindowProc.

Сообщение WM_INITDIALOG

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

Процедура может инициализировать элементы управления с помощью таких функций, как SetDlgItemText и CheckDlgButton. Так как элементы управления являются окнами, процедура также может управлять ими с помощью таких функций управления окнами, как EnableWindow и SetFocus. Процедура может получить дескриптор окна в элемент управления с помощью функции GetDlgItem.

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

Чтобы отобразить пользовательский значок на панели подпись диалогового окна, обработчик WM_INITDIALOG может отправить WM_SETICON сообщение в диалоговое окно.

Если приложение создает диалоговое окно с помощью одной из функций DialogBoxParam, DialogBoxIndirectParam, CreateDialogParam или CreateDialogIndirectParam, параметр lParam для сообщения WM_INITDIALOG содержит дополнительный параметр, переданный функции. Приложения обычно используют этот дополнительный параметр для передачи указателя на дополнительные сведения о инициализации в процедуру диалогового окна, но процедура диалогового окна должна определить значение параметра. Если приложение использует другую функцию для создания диалогового окна, система задает для параметра lParam значение NULL.

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

Сообщение WM_COMMAND

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

Все предопределенные элементы управления, кроме статических элементов управления, отправляют сообщения уведомлений для выбранных действий пользователя. Например, кнопка push отправляет сообщение уведомления BN_CLICKED всякий раз, когда пользователь нажимает кнопку. Во всех случаях слово с низким порядком параметра wParam содержит идентификатор элемента управления, слово с высоким порядком wParam содержит код уведомления, а параметр lParam содержит дескриптор окна управления.

Процедура диалогового окна должна отслеживать и обрабатывать сообщения уведомления. В частности, процедура должна обрабатывать сообщения с идентификаторами IDOK или IDCANCEL; эти сообщения представляют запрос пользователя, чтобы закрыть диалоговое окно. Процедура должна закрыть диалоговое окно с помощью функции EndDialog для модальных диалоговых окон и функции DestroyWindow для диалоговых окон без режима.

Система также отправляет WM_COMMAND сообщения в процедуру диалогового окна, если в диалоговом окне есть меню, например меню окна , и пользователь щелкает элемент меню. В частности, система отправляет сообщение WM_COMMAND с параметром wParam, установленным для IDCANCEL, когда пользователь нажимает кнопку "Закрыть" в меню окна диалогового окна. Сообщение почти идентично сообщению уведомления, отправленному кнопкой "Отмена ", и должно обрабатываться точно так же.

Сообщение WM_PARENTNOTIFY

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

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

Сообщения с цветом элемента управления

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

Элемент управления отправляет сообщение с цветом элемента управления в процедуру диалогового окна непосредственно перед тем, как он закрашивает свой фон. Сообщение позволяет процедуре указать, какую кисть следует использовать и задать цвета фона и переднего плана. Процедура задает кисть, возвращая дескриптор кисти. Чтобы задать цвета фона и переднего плана, процедура использует функции SetBkColor и SetTextColor с контекстом устройства отображения элемента управления. Сообщение с цветом элемента управления передает дескриптор контексту устройства отображения процедуре в параметре wParam сообщения.

Система отправляет WM_CTLCOLORDLG сообщение в процедуру диалогового окна, если процедура не обрабатывает сообщение WM_ERASEBKGND. Предопределенный класс диалогового окна не имеет фоновой кисти класса, поэтому это сообщение позволяет процедуре определять свой собственный фон без включения кода для выполнения работы.

В любом случае, если процедура диалогового окна не обрабатывает сообщение цвета элемента управления, система использует кисть с цветом окна по умолчанию для рисования фона для всех элементов управления и окон, кроме полос прокрутки. Приложение может получить цвет окна по умолчанию, передав значение COLOR_WINDOW функции GetSysColor . В то время как фон окрашен, цвет переднего плана для контекста устройства отображения имеет цвет текста по умолчанию (COLOR_WINDOWTEXT). Для полос прокрутки система использует кисть с цветом полосы прокрутки по умолчанию (COLOR_SCROLLBAR). В этом случае цвета фона и переднего плана для контекста устройства отображения задаются как белые и черные соответственно.

Диалоговое окно "Обработка сообщений по умолчанию"

Процедура окна для предопределенного класса диалогового окна выполняет обработку по умолчанию для всех сообщений, которые процедура диалогового окна не обрабатывает. Когда процедура диалогового окна возвращает значение FALSE для любого сообщения, предопределенная процедура окна проверка сообщения и выполняет следующие действия по умолчанию:

Message Действие по умолчанию
DM_GETDEFID Это сообщение можно отправить в диалоговое окно. Диалоговое окно возвращает идентификатор элемента управления кнопки по умолчанию, если диалоговое окно имеет одно из них; в противном случае возвращается ноль.
DM_REPOSITION Это сообщение можно отправить в диалоговое окно верхнего уровня. Диалоговое окно переместится в область рабочего стола.
DM_SETDEFID Это сообщение можно отправить в диалоговое окно. Диалоговое окно задает кнопку нажатия по умолчанию для элемента управления, указанного идентификатором элемента управления в параметре wParam .
WM_ACTIVATE Восстанавливает фокус ввода в элемент управления, определенный ранее сохраненным дескриптором, если диалоговое окно активировано. В противном случае процедура сохраняет дескриптор в элемент управления с фокусом ввода.
WM_CHARTOITEM Возвращает ноль.
WM_CLOSE Отправляет сообщение уведомления BN_CLICKED в диалоговое окно, указывая IDCANCEL в качестве идентификатора элемента управления. Если в диалоговом окне есть идентификатор элемента управления IDCANCEL и элемент управления в данный момент отключен, процедура звучит предупреждение и не публикует сообщение.
WM_COMPAREITEM Возвращает ноль.
WM_ERASEBKGND Заполняет область клиента диалогового окна с помощью кисти, возвращаемой из сообщения WM_CTLCOLORDLG или цвета окна по умолчанию.
WM_GETFONT Возвращает дескриптор для шрифта диалогового окна, определенного приложением.
WM_INITDIALOG Возвращает ноль.
WM_LBUTTONDOWN Отправляет сообщение CB_SHOWDROPDOWN в поле со списком с фокусом ввода, направляя элемент управления для скрытия раскрывающегося списка. Процедура вызывает DefWindowProc для выполнения действия по умолчанию.
WM_NCDESTROY Освобождает глобальную память, выделенную для элементов управления изменениями в диалоговом окне (применяется к диалоговым окнам, определяющим стиль DS_LOCALEDIT) и освобождает любой определяемый приложением шрифт (применяется к диалоговым окнам, определяющим стиль DS_SETFONT или DS_SHELLFONT). Процедура вызывает функцию DefWindowProc , чтобы завершить действие по умолчанию.
WM_NCLBUTTONDOWN Отправляет сообщение CB_SHOWDROPDOWN в поле со списком с фокусом ввода, направляя элемент управления для скрытия раскрывающегося списка. Процедура вызывает DefWindowProc для выполнения действия по умолчанию.
WM_NEXTDLGCTL Задает фокус ввода для следующего или предыдущего элемента управления в диалоговом окне, для элемента управления, определяемого дескриптором в параметре wParam, или в первом элементе управления в диалоговом окне, который отображается, не отключен и имеет стиль WS_TABSTOP. Процедура игнорирует это сообщение, если текущее окно с фокусом ввода не является элементом управления.
WM_SETFOCUS Задает фокус ввода для элемента управления, определяемого ранее сохраненным дескриптором окна управления. Если такой дескриптор отсутствует, процедура задает фокус ввода для первого элемента управления в шаблоне диалогового окна, который отображается, не отключен и имеет стиль WS_TABSTOP. Если такой элемент управления не существует, процедура задает фокус ввода первым элементом управления в шаблоне.
WM_SHOWWINDOW Сохраняет дескриптор, имеющий фокус ввода, если диалоговое окно скрыто, а затем вызывает DefWindowProc , чтобы завершить действие по умолчанию.
WM_SYSCOMMAND Сохраняет дескриптор элемента управления с фокусом ввода, если диалоговое окно свернуто, а затем вызывает DefWindowProc , чтобы завершить действие по умолчанию.
WM_VKEYTOITEM Возвращает ноль.

Предопределенная процедура окна передает все остальные сообщения в DefWindowProc для обработки по умолчанию.

Интерфейс клавиатуры диалогового окна

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

Ключ. Действие
ALT+mnemonic Перемещает фокус ввода на первый элемент управления (с WS_TABSTOP стилем) после статического элемента управления, содержащего указанный mnemonic.
СБОЙ Перемещает фокус ввода на следующий элемент управления в группе.
ВХОД В СИСТЕМУ Отправляет WM_COMMAND сообщение в процедуру диалогового окна. Параметр wParam имеет идентификатор IDOK или идентификатор элемента управления кнопки нажатия по умолчанию.
ESC Отправляет WM_COMMAND сообщение в процедуру диалогового окна. Параметр wParam имеет значение IDCANCEL.
LEFT Перемещает фокус ввода на предыдущий элемент управления в группе.
Мнемонические Перемещает фокус ввода на первый элемент управления (с WS_TABSTOP стилем) после статического элемента управления, содержащего указанный mnemonic.
RIGHT Перемещает фокус ввода на следующий элемент управления в группе.
SHIFT + TAB Перемещает фокус ввода на предыдущий элемент управления с WS_TABSTOP стилем.
TAB Перемещает фокус ввода на следующий элемент управления с WS_TABSTOP стилем.
UP Перемещает фокус ввода на предыдущий элемент управления в группе.

Система автоматически предоставляет интерфейс клавиатуры для всех модальных диалоговых окон. Он не предоставляет интерфейс для диалоговых окон без режима, если приложение не вызывает функцию IsDialogMessage для фильтрации сообщений в основном цикле сообщений. Это означает, что приложение должно передать сообщение в IsDialogMessage сразу после получения сообщения из очереди сообщений. Функция обрабатывает сообщения, если оно предназначено для диалогового окна и возвращает ненулевое значение, указывающее, что сообщение обработано и не должно передаваться функции TranslateMessage или DispatchMessage.

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

Стиль WS_TABSTOP

Стиль WS_TABSTOP указывает элементы управления, в которые пользователь может перемещаться, нажав клавишу TAB или клавиши SHIFT+TAB.

Когда пользователь нажимает клавишу TAB или SHIFT+TAB, система сначала определяет, обрабатываются ли эти ключи элементом управления, который в настоящее время имеет фокус ввода. Он отправляет элемент управления WM_GETDLGCODE сообщение, а если элемент управления возвращает DLGC_WANTTAB, система передает ключи элементу управления. В противном случае система использует функцию GetNextDlgTabItem для поиска следующего элемента управления, видимого, не отключенного и имеющего стиль WS_TABSTOP. Поиск начинается с элемента управления с фокусом ввода и выполняется в том порядке, в котором были созданы элементы управления, то есть порядок, в котором они определены в шаблоне диалогового окна. Когда система находит элемент управления с необходимыми характеристиками, система перемещает в него фокус ввода.

Если поиск следующего элемента управления со стилем WS_TABSTOP встречает окно с WS_EX_CONTROLPARENT стилем, система рекурсивно выполняет поиск дочерних элементов окна.

Приложение также может использовать GetNextDlgTabItem для поиска элементов управления с WS_TABSTOP стилем. Функция извлекает дескриптор окна следующего или предыдущего элемента управления с WS_TABSTOP стилем без перемещения фокуса ввода.

Стиль WS_GROUP

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

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

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

Элементы управления GetNextDlgGroupItem выполняют поиск в порядке (или обратном порядке), которые они были созданы. Если пользователь нажимает клавишу RIGHT или DOWN, GetNextDlgGroupItem возвращает следующий элемент управления, если этот элемент управления не имеет стиля WS_GROUP. В противном случае функция изменяет порядок поиска и возвращает первый элемент управления, имеющий стиль WS_GROUP . Если пользователь нажимает клавишу LEFT или UP, функция возвращает предыдущий элемент управления, если текущий элемент управления уже не имеет стиля WS_GROUP . Если текущий элемент управления имеет этот стиль, функция изменяет порядок поиска, находит первый элемент управления, имеющий стиль WS_GROUP , и возвращает элемент управления, который сразу же предшествует расположенному элементу управления.

Если поиск следующего элемента управления в группе встречает окно с WS_EX_CONTROLPARENT стилем, система рекурсивно выполняет поиск дочерних элементов окна.

После того как система имеет следующий или предыдущий элемент управления, он отправляет WM_GETDLGCODE сообщение в элемент управления, чтобы определить тип элемента управления. Затем система перемещает фокус ввода для управления, если он не является статическим элементом управления. Если элемент управления является автоматическим переключателем, система отправляет в него BM_CLICK сообщение. Приложение также может использовать GetNextDlgGroupItem для поиска элементов управления в группе.

Как правило, первый элемент управления в группе объединяет стили WS_GROUP и WS_TABSTOP, чтобы пользователь смог перейти из группы в группу с помощью клавиши TAB. Если группа содержит переключатели, приложение должно применить стиль WS_TABSTOP только к первому элементу управления в группе. Система автоматически перемещает стиль, когда пользователь перемещается между элементами управления в группе. Это гарантирует, что фокус ввода всегда будет находиться на последнем выбранном элементе управления при переходе пользователя в группу с помощью клавиши TAB.

Мнемоники

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

Приложение создает mnemonic для элемента управления, вставляя амперсанд (&) непосредственно перед выбранной буквой или цифрой в метке или тексте элемента управления. В большинстве случаев строка, завершающаяся значением NULL, предоставляемая элементом управления в шаблоне диалогового окна, содержит амперсанд. Однако приложение может создавать mnemonic в любое время, заменив существующую метку или текст элемента управления с помощью функции SetDlgItemText. Для каждого элемента управления можно указать только один mnemonic. Хотя рекомендуется, mnemonics в диалоговом окне не обязательно быть уникальным.

Когда пользователь нажимает букву или клавишу цифры, система сначала определяет, обрабатывает ли текущий элемент управления с фокусом ввода. Система отправляет в элемент управления сообщение WM_GETDLGCODE, а если элемент управления возвращает значение DLGC_WANTALLKEYS или DLG_WANTMESSAGE, система передает ключ элементу управления. В противном случае он выполняет поиск элемента управления, чей mnemonic соответствует указанному букве или цифре. Он продолжает искать до тех пор, пока он не находит элемент управления или проверяет все элементы управления. Во время поиска он пропускает все статические элементы управления, имеющие стиль SS_NOPREFIX.

Если поиск элемента управления с соответствующим mnemonic встречает окно с стилем WS_EX_CONTROLPARENT , система рекурсивно выполняет поиск дочерних элементов окна.

Если система находит статический элемент управления и элемент управления не отключается, система перемещает фокус ввода на первый элемент управления после того, как статический элемент управления отображается, не отключен и имеет стиль WS_TABSTOP. Если система находит другой элемент управления, имеющий соответствующий mnemonic, он перемещает фокус ввода в этот элемент управления. Если элемент управления является кнопкой нажатия по умолчанию, система отправляет сообщение BN_CLICKED уведомления в процедуру диалогового окна. Если элемент управления является другим стилем кнопки, и в диалоговом окне нет другого элемента управления с тем же mnemonic, система отправляет BM_CLICK сообщение в элемент управления.

Диалоговое окно Параметры

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

Дополнительные сведения см. в следующих разделах:

Переключатели и флажки

Диалоговые окна используют переключатели и проверка поля, чтобы разрешить пользователю выбирать из списка параметров. Переключатели позволяют пользователю выбирать из взаимоисключающих параметров; проверка поля позволяют пользователю выбрать сочетание параметров.

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

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

Диалоговое окно "Изменить элементы управления"

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

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

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

Списки, поля со списком и списки каталогов

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

Диалоговое окно также может использовать поле со списком для отображения списка имен файлов. Функция DlgDirListComboBox автоматически заполняет часть поля со списком с именами файлов в текущем каталоге. Функция DlgDirSelectComboBoxEx извлекает выбранное имя файла из части списка.

Диалоговое окно "Управление сообщениями"

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

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

Дополнительные сведения об сообщениях элемента управления см. в разделе "Элементы управления Windows".

Пользовательские диалоговые окна

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

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

Многие приложения создают новый класс диалогового окна, сначала извлекая сведения о классе предопределенного диалогового окна и передавая его в функцию GetClassInfo, которая заполняет структуру WNDCLASS сведениями. Приложение изменяет отдельные члены структуры, такие как имя класса, кисть и значок, а затем регистрирует новый класс с помощью функции RegisterClass . Если приложение заполняет структуру WNDCLASS самостоятельно, она должна задать член cbWndExtra для DLGWINDOWEXTRA, что является числом дополнительных байтов, необходимых системе для каждого диалогового окна. Если приложение также использует дополнительные байты для каждого диалогового окна, они должны находиться за пределами дополнительных байтов, необходимых системе.

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

Приложение также может создавать пользовательские диалоговые окна, подклассив процедуру окна предопределенного диалогового окна. Функция SetWindowLong позволяет приложению указать процедуру окна для указанного окна. Приложение также может попытаться выполнить подкласс с помощью функции SetClassLong , но это влияет на все диалоговые окна в системе, а не только те, которые относятся к приложению.

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