Автоматическое масштабирование (Windows Forms .NET)
Автоматическое масштабирование позволяет форме и ее элементам управления, разработанным на одном компьютере с использованием определенного разрешения или шрифтов, правильно отображаться на другом компьютере с другим разрешением или шрифтом. Оно гарантирует, что размеры формы и ее элементов управления будут изменяться автоматически в соответствии с приложениями Windows и другими приложениями на компьютерах пользователя и разработчика. Автоматическое масштабирование и стили оформления позволяют приложениям Windows Forms сохранять согласованный внешний вид и поведение на различных компьютерах пользователей, так же как в случае с обычными приложениями Windows.
В большинстве случаев автоматическое масштабирование работает должным образом в Windows Forms. Однако изменения схемы шрифтов могут быть проблематичными.
Потребность в автоматическом масштабировании
Без автоматического масштабирования приложения, разработанные для определенного разрешения экрана или шрифта, будут выглядеть либо слишком маленькими, либо слишком большими при изменении разрешения или шрифта. Например, если приложение разработано с использованием базового шрифта Tahoma размером 9 пунктов, то без коррекции оно будет выглядеть слишком маленьким при запуске на компьютере, на котором в качестве системного шрифта используется Tahoma размером 12 пунктов. Текстовые элементы, такие как заголовки, меню, содержимое текстовых полей и т. д., будут меньше, чем в других приложениях. Более того, размер содержащих текст элементов пользовательского интерфейса, таких как строки заголовков, меню и т. д., зависит от используемого шрифта. В рассматриваемом примере эти элементы также будут выглядеть относительно меньше.
Аналогичная ситуация возникает, когда приложение разработано для определенного разрешения экрана. Наиболее распространенное разрешение экрана — 96 точек на дюйм (DPI), что соответствует 100 % масштабирования экрана, однако все более распространенными становятся более высокие разрешения, включая 125 %, 150 %, 200 % (что соответствует 120, 144 и 192 DPI) и выше. Без коррекции приложение, особенно графическое, разработанное для одного разрешения, будет отображаться либо слишком большим, либо слишком маленьким при запуске с другим разрешением.
Автоматическое масштабирование предназначено для решения таких проблем путем автоматического изменения размеров формы и ее дочерних элементов управления согласно относительному размеру шрифтов и разрешению экрана. Операционная система Windows поддерживает автоматическое масштабирование диалоговых окон с помощью относительной единицы измерения, называемой единицей размера диалогового окна. Единица размера диалогового окна основана на системном шрифте, а ее связь с пикселями можно определить с помощью функции GetDialogBaseUnits
пакета Win32 SDK. При изменении темы, используемой Windows, все диалоговые окна автоматически настраиваются соответствующим образом. Кроме того, в Windows Forms поддерживается автоматическое масштабирование в соответствии со стандартным системным шрифтом или разрешением экрана. При необходимости автоматическое масштабирование можно отключить в приложении.
Внимание
Произвольные сочетания режимов масштабирования на основе разрешения экрана и размера шрифта не поддерживаются. Вы без всяких проблем можете масштабировать пользовательский элемент управления в одном режиме (например, на основе разрешения экрана) и поместить его в форму с помощью другого режима (на основе размера шрифта), но использование базовой формы в одном режиме и производной формы в другом может привести к непредвиденным результатам.
Автоматическое масштабирование в действии
В Windows Forms для автоматического масштабирования формы и ее содержимого используется описанная ниже логика.
Во время разработки каждый объект ContainerControl регистрирует режим масштабирования и его текущее разрешение в свойствах AutoScaleMode и AutoScaleDimensions соответственно.
Во время выполнения фактическое разрешение хранится в свойстве CurrentAutoScaleDimensions. Свойство AutoScaleFactor динамически вычисляет отношение между разрешением во время выполнения и разрешением во время разработки.
Если при загрузке формы значения CurrentAutoScaleDimensions и AutoScaleDimensions различны, то для масштабирования элемента управления и его дочерних элементов вызывается метод PerformAutoScale. Этот метод приостанавливает размещение и вызывает метод Scale для выполнения фактического масштабирования. Впоследствии значение AutoScaleDimensions обновляется во избежание прогрессивного масштабирования.
Метод PerformAutoScale также вызывается автоматически в перечисленных ниже ситуациях.
В ответ на событие OnFontChanged, если используется режим масштабирования Font.
Если при возобновлении размещения элементов управления внутри контейнера обнаруживается изменение свойства AutoScaleDimensions или AutoScaleMode.
При масштабировании родительского объекта ContainerControl, как указанно выше. Каждый контейнерный элемент управления отвечает за масштабирование своих дочерних элементов с помощью своих собственных коэффициентов масштабирования, а не коэффициентов его родительского контейнера.
Поведение дочерних элементов управления при масштабировании может изменяться несколькими способами.
Можно переопределить свойство ScaleChildren, чтобы указать, следует ли масштабировать дочерние элементы управления.
Можно переопределить метод GetScaledBounds для корректировки границ, до которых масштабируется элемент управления, но не логики масштабирования.
Можно переопределить метод ScaleControl для изменения логики масштабирования текущего элемента управления.
См. также
.NET Desktop feedback