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

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

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

Осведомленность о DPI в .NET

Поддержка DPI настраивается в файле проекта с помощью свойства ApplicationHighDpiMode, которому по умолчанию присвоено значение SystemAware. Эта конфигурация работает с системой начальной загрузки приложения для автоматической настройки обработки DPI при запуске приложения.

Режим DPI по умолчанию и рекомендуемый режим DPI для приложений Windows Forms — SystemAware. Этот режим запрашивает параметр DPI один раз при запуске приложения и использует это значение в течение всего времени существования приложения, обеспечивая согласованное масштабирование.

Настройте режим DPI в файле проекта:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
  </PropertyGroup>
</Project>

Note

Хотя рекомендуемый подход заключается в настройке DPI с помощью файла проекта, вы по-прежнему можете использовать файл манифеста приложения (app.manifest) для переопределения этих параметров. Однако использование манифеста не рекомендуется, так как это может привести к конфликтам с конфигурацией приложения. Дополнительные сведения см. в разделе Предупреждение компилятора WFO0003.

Особенности конструктора Visual Studio

При проектировании форм в Visual Studio может потребоваться настроить поддержку DPI для конструктора форм отдельно от вашего приложения. Начиная с версии 17.8 Visual Studio 2022, вы можете задать свойство ForceDesignerDPIUnaware в файле проекта, чтобы конструктор Windows Forms запускался в режиме без учета DPI. Этот параметр помогает избежать проблем с отрисовкой при проектировании форм на мониторах с высоким уровнем DPI:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
  </PropertyGroup>
</Project>

Это свойство влияет только на конструктор Visual Studio и не изменяет способ работы приложения. Дополнительные сведения см. в разделе "Отключение осведомленности о DPI", чтобы устранить проблемы с масштабированием.

Доступные режимы DPI включают:

  • SystemAware— Приложение запрашивает DPI один раз при запуске и использует это значение для времени существования приложения.
  • PerMonitor— приложение проверяет наличие изменений DPI на основе каждого монитора и перемасштабирует при изменении DPI.
  • PerMonitorV2— Аналогично PerMonitor, но включает уведомления об изменении в дочернем окне DPI и улучшенное поведение масштабирования.
  • DpiUnaware— Приложение не масштабируется для изменений DPI и Windows обрабатывает масштабирование.
  • DpiUnawareGdiScaled— Аналогично DpiUnaware , но обеспечивает лучшее качество содержимого на основе GDI.

Дополнительные сведения о настройке параметров DPI см. в статье "Новые возможности Windows Forms для .NET 6".

Необходимость автоматического масштабирования

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

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

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

Осторожность

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

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

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

Улучшения высокого уровня DPI

.NET включает значительные улучшения в отрисовке на дисплеях с высоким DPI, особенно в режиме PerMonitorV2:

  • Осведомленность о DPI для каждого монитора — приложения динамически настраиваются при перемещении между мониторами с различными параметрами DPI.
  • Улучшено поведение масштабирования— элементы управления масштабируются правильно при изменении DPI, включая вложенные элементы управления и элементы управления контейнерами (.NET 6+).
  • Масштабирование размера формыMaximumSize и MinimumSize масштабирование свойств на основе текущих параметров DPI монитора (.NET 7+, включено по умолчанию в .NET 8+).
  • События изменения DPI— новые события позволяют программно обрабатывать динамические изменения DPI:
    • DpiChanged— возникает при изменении параметра DPI на отображаемом устройстве, где в настоящее время отображается форма.
    • DpiChangedBeforeParent— возникает, когда параметр DPI для элемента управления изменяется программным способом перед событием изменения DPI для родительского элемента управления или формы.
    • DpiChangedAfterParent—Срабатывает, когда значение DPI для элемента управления изменяется программно после возникновения события изменения DPI для его родительского элемента управления или формы.

Дополнительные сведения о высоких улучшениях DPI см. в статье "Новые возможности Windows Forms для .NET 6", "Новые возможности" Windows Forms для .NET 7 и новые возможности Windows Forms для .NET 8.

Различия в .NET Framework

.NET Framework и .NET по-разному обрабатывают осведомленность о DPI:

  • В .NET Framework настройте осведомленность о DPI через файл app.config с элементом<System.Windows.Forms.ApplicationConfigurationSection>.
  • В .NET настройте осведомленность о DPI через файл проекта со свойствомApplicationHighDpiMode.
  • .NET Framework использует файлы манифеста для конфигурации DPI, которая больше не рекомендуется.
  • .NET обеспечивает более эффективное масштабирование и более надежную обработку изменений DPI.

Сведения о настройке DPI в .NET Framework см. в разделе Поддержка высокого DPI в Windows Forms.

См. также