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

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

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

Важно!

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

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

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

Аналогичная ситуация возникает, когда приложение разработано для определенного разрешения экрана. Наиболее распространенное разрешение экрана — 96 точек на дюйм (DPI), что соответствует 100 % масштабирования экрана, однако все более распространенными становятся более высокие разрешения, включая 125 %, 150 %, 200 % (что соответствует 120, 144 и 192 DPI) и выше. Без коррекции приложение, особенно графическое, разработанное для одного разрешения, будет отображаться либо слишком большим, либо слишком маленьким при запуске с другим разрешением.

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

Внимание

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

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

В 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 для изменения логики масштабирования текущего элемента управления.

См. также