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


Автоматическое масштабирование в Windows Forms

Обновлен: Ноябрь 2007

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

Потребность в автоматическом масштабировании

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

Аналогичная ситуация возникает, когда приложение разработано для определенного экранного разрешения. Наиболее частое разрешение экрана — 96 точек на дюйм (dpi), однако все более распространенными становятся более высокие разрешения, включая 120, 133, 170 и более точек на дюйм. Без коррекции приложение, особенно графическое, разработанное для одного разрешения, будет отображаться либо слишком большим, либо слишком маленьким при запуске с другим разрешением.

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

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

Исходная поддержка автоматического масштабирования

В .NET Framework версий 1.0 и 1.1 автоматическое масштабирование поддерживалось простым способом, который зависел от шрифта Windows, используемого по умолчанию для интерфейса пользователя, представленного в Win32 SDK значением DEFAULT_GUI_FONT. Обычно этот шрифт изменяется только при изменении разрешения экрана. Для реализации автоматического масштабирования применялись перечисленные ниже механизмы.

  1. Во время разработки свойству AutoScaleBaseSize (которое теперь устарело) присваивалась высота и ширина стандартного системного шрифта на компьютере разработчика.

  2. Во время выполнения для инициализации свойства Font класса Form использовался стандартный системный шрифт компьютера пользователя.

  3. Перед отображением формы вызывался метод ApplyAutoScaling для масштабирования формы. Этот метод вычислял относительный масштаб при помощи свойств AutoScaleBaseSize и Font, а затем вызывал метод Scale для масштабирования формы и ее дочерних элементов.

  4. Значение свойства AutoScaleBaseSize обновлялось таким образом, чтобы последующие вызовы ApplyAutoScaling не продолжали изменять размер формы.

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

  • Поскольку свойство AutoScaleBaseSize представляет базовый размер шрифта в виде целого значения, погрешности округления становились заметны, когда форма проходила через ряд разрешений.

  • Автоматическое масштабирование было реализовано только в классе Form, но не в классе ContainerControl. В результате, пользовательские элементы управления будут масштабироваться корректно, только если пользовательский элемент управления был разработан с тем же разрешением, что и форма, и был помещен в форму во время разработки.

  • Формы и их дочерние элементы управления могли разрабатываться параллельно несколькими разработчиками, только если их разрешения совпадали. Аналогичным образом, наследование форм зависело от разрешения родительской формы.

  • Он не совместим с новыми диспетчерами разметки, добавленными в .NET Framework версии 2.0, такими как FlowLayoutPanel и TableLayoutPanel.

  • Он не поддерживает масштабирования непосредственно на основе разрешения экрана, необходимое для совместимости с .NET Compact Framework.

Хотя этот механизм сохраняется в .NET Framework версии 2.0 для обеспечения обратной совместимости, он был заменен более надежным механизмом масштабирования, описанным ниже. Как следствие, методы AutoScale, ApplyAutoScaling, AutoScaleBaseSize и некоторые перегрузки Scale помечены как устаревшие.

ms229605.alert_note(ru-ru,VS.90).gifПримечание.

Можно безопасно удалить ссылки на эти элементы при обновлении устаревшего кода до .NET Framework версии 2.0.

Текущая поддержка автоматического масштабирования

.NET Framework версии 2.0 обходит предыдущие ограничения путем введения следующих изменений в автоматическое масштабирование форм Windows Forms.

  • Базовая поддержка масштабирования была перемещена в класс ContainerControl, чтобы формы, собственные составные элементы управления и пользовательские элементы управления получали единообразную поддержку масштабирования. Были добавлены новые члены AutoScaleFactor, AutoScaleDimensions, AutoScaleMode и PerformAutoScale.

  • Класс Control также имеет несколько новых членов, которые позволяют ему участвовать в масштабировании и поддерживать смешанное масштабирование в одной и той же форме. В частности, члены Scale, ScaleChildren и GetScaledBounds поддерживают масштабирование.

  • В дополнение к поддержке системного шрифта была добавлена поддержка масштабирования на основе разрешения экрана в соответствии со значениями перечисления AutoScaleMode. Этот режим обеспечивает совместимость с автоматическим масштабированием, поддерживаемым .NET Compact Framework для обеспечения более простой миграции приложений.

  • В реализацию автоматического масштабирования была добавлена совместимость с диспетчерами макетов, такими как FlowLayoutPanel и TableLayoutPanel.

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

ms229605.alert_caution(ru-ru,VS.90).gifВнимание!

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

Автоматическое масштабирование в действии

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

  1. Во время разработки каждый класс ContainerControl регистрирует режим масштабирования и его текущее разрешение в свойствах AutoScaleMode и AutoScaleDimensions соответственно.

  2. Во время выполнения фактическое разрешение хранится в свойстве CurrentAutoScaleDimensions. Свойство AutoScaleFactor динамически вычисляет отношение между разрешением во время выполнения и разрешением во время разработки.

  3. Если при загрузке формы значения CurrentAutoScaleDimensions и AutoScaleDimensions различны, то для масштабирования элемента управления и его дочерних элементов вызывается метод PerformAutoScale. Этот метод приостанавливает размещение и вызывает метод Scale для выполнения фактического масштабирования. Впоследствии значение AutoScaleDimensions обновляется, чтобы избежать прогрессивного масштабирования.

  4. Метод PerformAutoScale также вызывается автоматически в перечисленных ниже ситуациях.

    • В ответ на событие OnFontChanged в случае, если используется режим масштабирования Font.

    • Если при продолжении расположения элементов управления внутри контейнера обнаруживается изменение в свойствах AutoScaleDimensions или AutoScaleMode.

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

  5. Дочерние элементы управления могут изменить свое поведение при масштабировании несколькими средствами.

    • Свойство ScaleChildren может быть переопределено, чтобы определить, нуждаются ли дочерние элементы управления в масштабировании или нет.

    • Метод GetScaledBounds может быть переопределен для корректировки границ, до которых масштабируется элемент управления, но не логики масштабирования.

    • Метод ScaleControl может быть переопределен для изменения логики масштабирования для текущего элемента управления.

См. также

Задачи

Практическое руководство. Включение визуальных стилей Windows XP

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

Основные понятия

Отрисовка элементов управления с применением визуальных стилей

Ссылки

AutoScaleMode

Scale

PerformAutoScale

AutoScaleDimensions