Поделиться через


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

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

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

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

Процедура диалогового окна аналогична процедуре окна в том, что система отправляет сообщения в процедуру, когда она содержит сведения для предоставления или выполнения задач. В отличие от процедуры окна, процедура диалогового окна никогда не вызывает функцию 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 при создании элементов управления. Приложение не может переопределить это поведение по умолчанию, если только оно не создает собственные элементы управления для диалогового окна.

Control-Color сообщения

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

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

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

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

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

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

Сообщение Действие по умолчанию
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+мнемоника Перемещает фокус ввода на первый элемент управления (со стилем WS_TABSTOP) после статического элемента управления, содержащего указанную мнемонику.
ВНИЗ Перемещает фокус ввода на следующий элемент управления в группе.
ВОЙДИТЕ Отправляет сообщение WM_COMMAND в процедуру диалогового окна. Параметр wParam имеет идентификатор IDOK или идентификатор элемента управления кнопки push по умолчанию.
ESC Отправляет сообщение WM_COMMAND в процедуру диалогового окна. Параметр wParam имеет значение IDCANCEL.
НАЛЕВО Перемещает фокус ввода на предыдущий управляющий элемент в пределах группы.
мнемоника Перемещает фокус ввода на первый элемент управления (со стилем WS_TABSTOP) после статического элемента управления, содержащего указанную мнемонику.
ПРАВИЛЬНО Перемещает фокус ввода на следующий элемент управления в группе.
SHIFT+TAB Перемещает фокус ввода на предыдущий элемент управления со стилем WS_TABSTOP.
ТАБ Перемещает фокус ввода на следующий элемент управления со стилем WS_TABSTOP.
ВВЕРХ Перемещает фокус ввода на предыдущий элемент управления в группе.

Система автоматически предоставляет интерфейс клавиатуры для всех модальных диалоговых окон. Он не предоставляет интерфейс для немодальных диалоговых окон, если приложение не вызывает функцию 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 — это выбранная буква или цифра в метке на кнопке или в тексте неизменяемого элемента управления. Система перемещает фокус ввода на элемент управления, связанный с макросом, всякий раз, когда пользователь нажимает клавишу, соответствующую макросу, или нажимает эту клавишу в сочетании с клавишей ALT. Mnemonics предоставляет быстрый способ перехода пользователя к указанному элементу управления с помощью клавиатуры.

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

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

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

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

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

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

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

Радиокнопки и флажки

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

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

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

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

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

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

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

Элементы списка, выпадающие списки и каталоги

В некоторых диалоговых окнах отображаются списки имен, из которых пользователь может выбрать одно или несколько имен. Для отображения списка имен файлов, например, диалоговое окно обычно использует поле списка и функции DlgDirList и DlgDirSelectEx. Функция Dl 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, перемещает фокус ввода в указанный элемент управления и обновляет внешний вид элементов управления, например, изменяя границу кнопки по умолчанию или настраивая автоматический переключатель.