диалоговые окна «О программе»

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

Этот обзор включает следующие разделы:

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

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

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

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

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

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

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

Система отправляет 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, даже если окно владельца активно.

Приложение отвечает за получение и отправку входных сообщений в диалоговое окно. Большинство приложений используют для этого цикл сообщений main. Однако, чтобы разрешить пользователю переходить к элементам управления и выбирать их с помощью клавиатуры, приложение должно вызывать функцию 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 для классов. Если диалоговое окно содержит элемент управления, принадлежащий пользовательскому классу окна элемента управления, шаблон присваивает имя этого зарегистрированного класса окна или значение 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, которая идентифицирует ресурс меню в исполняемом файле.
  • Класс window диалогового окна. Это может быть либо предопределенный класс диалогового окна, либо порядковое значение или строка Юникода, завершающаяся null, которая идентифицирует зарегистрированный класс окна.
  • Строка Юникода, заканчивающаяся null, которая указывает заголовок окна диалогового окна. Если строка пуста, строка заголовка диалогового окна пуста. Если диалоговое окно не имеет стиля WS_CAPTION , система задает заголовок указанной строки, но не отображает его.
  • Если диалоговое окно имеет стиль DS_SETFONT , заголовок указывает размер точки и имя шрифта, используемого для текста в клиентской области и элементах управления диалогового окна.

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

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

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

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

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

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

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