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


Сведения о диалоговых окнах

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

В этом обзоре содержатся следующие разделы:

Дополнительные сведения о стандартных диалоговых окнах см. в библиотеке общих диалоговых окон .

Когда следует использовать диалоговое окно

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

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

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

Чтобы создать модальное или безрежимное диалоговое окно, приложение должно предоставить шаблон диалогового окна для описания стиля и содержимого диалогового окна; Приложение также должно предоставить процедуру диалогового окна для выполнения задач. Шаблон диалогового окна представляет собой двоичное описание диалогового окна и элементов управления, содержащихся в нем. Разработчик может создать этот шаблон как ресурс для загрузки из исполняемого файла приложения или создать в памяти во время выполнения приложения. Процедура диалогового окна — это определяемая приложением функция обратного вызова, которая вызывается системой при входе в диалоговое окно или задачи для выполнения диалогового окна. Хотя процедура диалогового окна аналогична процедуре окна, она не имеет одинаковых обязанностей.

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

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

Окно владельца диалогового окна

Большинство диалоговых окон имеют родительское окно (или проще говоря, владельца). При создании диалогового окна приложение задает владельца, указав дескриптор окна владельца. Система использует владельца для определения позиции диалогового окна в порядке Z, чтобы диалоговое окно всегда располагалось над его владельцем. Кроме того, система может отправлять сообщения в процедуру окна владельца, уведомляя его о событиях в диалоговом окне.

Система автоматически скрывает или уничтожает диалоговое окно всякий раз, когда его владелец скрыт или уничтожен. Это означает, что процедура диалогового окна не требует специальной обработки для обнаружения изменений в состоянии окна владельца.

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

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

Поля сообщений

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

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

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

Система может отправлять сообщения владельцу, например WM_CANCELMODE и WM_ENABLE, как и при создании модального диалогового окна. Окно владельца должно выполнять любые действия, запрошенные этими сообщениями.

Модальное диалоговое окно должно быть всплывающим окном с меню окна, строкой заголовка и толстой границей; то есть шаблон диалогового окна должен указывать стили WS_POPUP, WS_SYSMENU, WS_CAPTIONи DS_MODALFRAME. Хотя приложение может назначить стиль WS_VISIBLE, система всегда отображает модальное диалоговое окно независимо от того, указывает ли шаблон диалогового окна стиль WS_VISIBLE. Приложение не должно создавать модальное диалоговое окно с стилем WS_CHILD. Модальное диалоговое окно с этим стилем отключает себя, предотвращая получение последующих входных данных в приложение.

Приложение создает модальное диалоговое окно, используя функцию DialogBox или DialogBoxIndirect. DialogBox требует имени или идентификатора ресурса, содержащего шаблон диалогового окна; DialogBoxIndirect требует указателя на объект памяти, содержащий шаблон диалогового окна. Функции DialogBoxParam и DialogBoxIndirectParam также создают модальные диалоговые окна; они идентичны ранее упомянутым функциям, но передают указанный параметр в процедуру диалогового окна при создании диалогового окна.

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

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

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

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

Система отправляет сообщение WM_ENTERIDLE в окно владельца всякий раз, когда очередь сообщений приложения пуста. Приложение может использовать это сообщение для выполнения фоновой задачи, пока диалоговое окно остается на экране. Если приложение использует сообщение таким образом, оно должно часто передавать управление (например, с помощью функции PeekMessage), чтобы модальное диалоговое окно могло получать любые данные от пользователя. Чтобы запретить модальному диалогу отправлять сообщения WM_ENTERIDLE, приложение может указать стиль DS_NOIDLEMSG при создании диалогового окна.

Приложение уничтожает модальное диалоговое окно с помощью функции EndDialog. В большинстве случаев процедура диалогового окна вызывает EndDialog, когда пользователь нажимает "Закрыть" в меню окна или нажимает кнопку "ОК" или "Отмена" в диалоговом окне. Диалоговое окно может возвращать значение через функцию DialogBox (или другие функции создания), указав значение при вызове функции EndDialog . Система возвращает это значение после уничтожения диалогового окна. Большинство приложений используют это возвращаемое значение, чтобы определить, успешно ли диалоговое окно завершило задачу или было отменено пользователем. Система не возвращает управление из функции, которая создает диалоговое окно, пока процедура диалогового окна не вызовет функцию EndDialog.

Диалоговые окна без режима

Диалоговое окно без режима должно быть всплывающее окно с меню окна, строкой заголовка и тонкой границей; то есть шаблон диалогового окна должен указывать стили WS_POPUP, WS_CAPTION, WS_BORDERи WS_SYSMENU. Система не отображает диалоговое окно автоматически, если шаблон не указывает стиль WS_VISIBLE.

Приложение создает немодальное диалоговое окно с помощью функции CreateDialog или CreateDialogIndirect. CreateDialog требует имени или идентификатора ресурса, содержащего шаблон диалогового окна; CreateDialogIndirect требует дескриптора объекта памяти, содержащего шаблон диалогового окна. Две другие функции, CreateDialogParam и CreateDialogIndirectParam, также создают немодальные диалоговые окна; они передают заданный параметр в процедуру диалогового окна в момент создания.

CreateDialog и другие функции создания возвращают дескриптор окна в диалоговое окно. Приложение и процедура диалогового окна могут использовать этот дескриптор для управления диалоговым окном. Например, если WS_VISIBLE не указан в шаблоне диалогового окна, приложение может отобразить диалоговое окно, передав дескриптор окна в функцию ShowWindow.

Диалоговое окно без режима не отключает окно владельца и не отправляет в него сообщения. При создании диалогового окна система делает его активным окном, но пользователь или приложение могут изменять активное окно в любое время. Если диалоговое окно становится неактивным, оно все равно остается над окном владельца в Z-порядке, даже если окно владельца активно.

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

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

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

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

Процедура диалогового окна не должна вызывать функцию EndDialog, чтобы уничтожить немодальное диалоговое окно.

Шаблоны диалоговых окон

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

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

Заметка

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

 

Чтобы создать диалоговое окно без использования ресурсов шаблона, необходимо создать шаблон в памяти и передать его в функцию CreateDialogIndirectParam или DialogBoxIndirectParam или макрос CreateDialogIndirect или DialogBoxIndirect.

Шаблон диалогового окна в памяти состоит из заголовка, описывающего диалоговое окно, за которым следует один или несколько дополнительных блоков данных, описывающих каждый элемент управления в диалоговом окне. Шаблон может использовать стандартный или расширенный формат. В стандартном шаблоне заголовок — это структура DLGTEMPLATE, за которой следует дополнительные массивы переменной длины; и данные для каждого элемента управления состоят из структуры DLGITEMTEMPLATE с дополнительными массивами переменной длины. В шаблоне расширенного диалогового окна заголовок использует формат DLGTEMPLATEEX, а определения элементов управления используют формат DLGITEMTEMPLATEEX.

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

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

Стили шаблонов диалогового окна

Каждый шаблон диалогового окна задает сочетание значений стиля, определяющих внешний вид и функции диалогового окна. Значения стиля могут быть стилями окон, такими как WS_POPUP и WS_SYSMENU, а также стили диалоговых окон, например DS_MODALFRAME. Число и тип стилей для шаблона зависит от типа и назначения диалогового окна. Список значений см. в стилях диалогового окна.

Система передает все стили окон, указанные в шаблоне, функции CreateWindowEx при создании диалогового окна. Система может передавать один или несколько расширенных стилей в зависимости от указанных стилей диалогового окна. Например, если шаблон указывает DS_MODALFRAME, система использует WS_EX_DLGMODALFRAME при создании диалогового окна.

Большинство диалоговых окон — это всплывающие окна, в которых есть меню окна и строка заголовка. Поэтому типичный шаблон задает стили WS_POPUP, WS_SYSMENUи WS_CAPTION. Шаблон также задает стиль границы: WS_BORDER для немодальных диалоговых окон и DS_MODALFRAME для модальных диалоговых окон. Шаблон может указать тип окна, отличный от всплывающего окна (например, WS_OVERLAPPED), если он создает настраиваемое окно вместо диалогового окна.

Система всегда отображает модальное диалоговое окно независимо от того, указан ли стиль WS_VISIBLE. Если шаблон для немодального диалогового окна задает стиль WS_VISIBLE, система автоматически отображает диалоговое окно при его создании. В противном случае приложение отвечает за отображение диалогового окна с помощью функции ShowWindow.

Измерения диалогового окна

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

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

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

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

Элементы управления диалогового окна

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

Для каждого элемента управления шаблон задает значения стиля, определяющие внешний вид и операцию элемента управления. Каждый элемент управления является дочерним окном и поэтому должен иметь стиль WS_CHILD. Чтобы убедиться, что элемент управления отображается при отображении диалогового окна, каждый элемент управления также должен иметь стиль WS_VISIBLE. Другие часто используемые стили окон WS_BORDER для элементов управления с необязательными границами, WS_DISABLED для элементов управления, которые должны быть отключены при первоначальном создании диалогового окна, а также WS_TABSTOP и WS_GROUP для элементов управления, к которым можно получить доступ с помощью клавиатуры. Стили WS_TABSTOP и WS_GROUP используются вместе с диалоговым интерфейсом клавиатуры, описанным далее в этом разделе.

Шаблон также может указывать стили элементов управления, относящиеся к классу окна элемента управления. Например, шаблон, указывающий элемент управления кнопкой, должен дать стиль элемента управления кнопкой, например BS_PUSHBUTTON или BS_CHECKBOX. Система передает стили элементов управления процедуре окна управления через сообщение WM_CREATE, что позволяет процедуре адаптировать внешний вид и операцию элемента управления.

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

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

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

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

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

Меню диалогового окна

Система добавляет диалоговому окну меню, когда шаблон задает стиль WS_SYSMENU. Чтобы предотвратить недопустимый ввод данных, система автоматически отключает все элементы в меню, кроме перемещения и закрытия. Пользователь может щелкнуть Переместить, чтобы переместить диалоговое окно. Когда пользователь нажимает Закрыть, система отправляет в процедуру диалогового окна сообщение WM_COMMAND с параметром wParam, установленным в IDCANCEL. Это идентично сообщению, отправляемому кнопкой Отмена, когда пользователь нажимает на неё. Рекомендуемое действие для этого сообщения — закрыть диалоговое окно и отменить запрошенную задачу.

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

Шрифты диалогового окна

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

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

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

Системный шрифт может отличаться от разных версий Windows. Чтобы ваше приложение использовало системный шрифт независимо от того, на какой системе оно работает, используйте DS_SHELLFONT с шрифтом MS Shell Dlg и используйте ресурс DIALOGEX вместо ресурса DIALOG. Система сопоставляет этот шрифт, чтобы диалоговое окно использовало шрифт Tahoma. Обратите внимание, что DS_SHELLFONT не действует, если шрифт не является MS Shell Dlg.

Шаблоны в памяти

Шаблон диалогового окна в памяти состоит из заголовка, описывающего диалоговое окно, за которым следует один или несколько дополнительных блоков данных, описывающих каждый элемент управления в диалоговом окне. Шаблон может использовать стандартный или расширенный формат. В стандартном шаблоне заголовок представляет собой структуру DLGTEMPLATE, за которой следует дополнительные массивы переменной длины. Данные для каждого элемента управления состоят из структуры DLGITEMTEMPLATE, а после неё идут дополнительные массивы переменной длины. В шаблоне расширенного диалогового окна заголовок использует формат DLGTEMPLATEEX, а определения элементов управления используют формат DLGITEMTEMPLATEEX.

Чтобы различать стандартный шаблон и расширенный шаблон, проверьте первые 16 битов шаблона диалогового окна. В расширенном шаблоне первый WORD равен 0xFFFF, а любое другое значение указывает стандартный шаблон.

При создании шаблона диалогового окна в памяти необходимо убедиться, что каждое из DLGITEMTEMPLATE или DLGITEMTEMPLATEEX определений элементов управления должно быть выровнено по границам DWORD. Кроме того, любые данные о создании, идущие после определения элемента управления, должны быть выровнены по границе DWORD. Все остальные массивы переменной длины в шаблоне диалогового окна должны быть выровнены по границам Word.

Заголовок шаблона

В стандартных и расширенных шаблонах диалоговых окон заголовок содержит следующие общие сведения:

  • Расположение и измерения диалогового окна
  • Стили окон и диалоговых окон для диалогового окна
  • Количество элементов управления в диалоговом окне. Это значение определяет количество DLGITEMTEMPLATE или DLGITEMTEMPLATEEX определений элементов управления в шаблоне.
  • Необязательный ресурс меню для диалогового окна. Шаблон может указать, что диалоговое окно не содержит меню, или может указать порядковое значение или строку Юникода, завершающую значение NULL, которая определяет ресурс меню в исполняемом файле.
  • Класс окна диалогового окна. Это может быть либо стандартный класс диалогового окна, либо порядковое значение или строка Юникода, завершающая значение NULL, идентифицирующая зарегистрированный класс окна.
  • Юникод-строка с нулевым завершением, указывающая заголовок для окна диалогового бокса. Если строка пуста, заголовок диалогового окна пуст. Если в диалоговом окне нет стиля WS_CAPTION, система задает заголовок указанной строке, но не отображает его.
  • Если в диалоговом окне есть стиль DS_SETFONT, заголовок указывает размер точки и имя шрифта, используемого для текста в клиентской области и элементах управления диалоговым окном.

В расширенном шаблоне заголовок DLGTEMPLATE EX также указывает следующие дополнительные сведения:

  • Идентификатор контекста справки окна диалогового окна, используемый, когда система отправляет сообщение WM_HELP.
  • Если в диалоговом окне есть стиль DS_SETFONT или DS_SHELLFONT, заголовок указывает вес шрифта и указывает, является ли шрифт курсивом.

Определения элементов управления

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

В стандартных и расширенных шаблонах определение элемента управления содержит следующие сведения:

  • Расположение и размеры элемента управления.
  • Стили окон и элементов управления для элемента управления.
  • Идентификатор элемента управления.
  • Класс окна элемента управления. Это может быть порядковое значение предопределенного системного класса или строка Юникода, завершающая значение NULL, указывающее имя зарегистрированного класса окна.
  • Строка Юникода с завершением NULL, которая указывает начальный текст элемента управления или порядковое значение, определяющее ресурс, например, значок в исполняемом файле.
  • Необязательный блок переменной длины данных создания. Когда система создает элемент управления, она передает указатель на эти данные в параметре lParam сообщения WM_CREATE, которое отправляется в элемент управления.

В расширенном шаблоне определение контроля также указывает идентификатор контекста справки для этого контроля, когда система отправляет сообщение WM_HELP.