Устранение проблем с HDPI и масштабированием с помощью конструктора Windows Forms в Visual Studio

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

Более высокая плотность пикселей создает более острые изображения и правильно отображает элементы масштабирования. Без правильного масштабирования элементы пользовательского интерфейса и текст слишком крошечны для эффективного использования и могут перекрываться. Чтобы устранить эту проблему, Windows автоматически масштабирует процентиль пользовательского интерфейса в соответствии с параметром DPI. Например, параметр DPI 100% представляет 96 DPI и 125% — 120 DPI. Мониторы изначально производились с плотностью 96 пикселей на дюйм, что Windows использует в качестве основы для отображения растровой графики с масштабом 100%. Тем не менее, как технология отображения развивалась, мониторы теперь поставляются с панелями 300 DPI или выше.

Когда приложение заявляет о своей осведомленности о DPI, это означает, что приложение хорошо работает при более высоких настройках DPI, и поэтому Windows может применять автомасштабирование. И наоборот, приложения, не использующие DPI, отображаются в фиксированном значении DPI 96 пикселей на дюйм или 100%, и поэтому автоматическое масштабирование не применяется.

Конструктор Windows Forms не знает о DPI

Замечание

В Visual Studio 2022 версии 17.8 или более поздней версии можно избежать проблем, описанных в этой статье. Visual Studio 2022 версии 17.8 обеспечивает поддержку неузнаваемых вкладок DPI в приложении с поддержкой DPI. См. улучшения DPI Visual Studio. Это позволяет разрабатывать Windows Forms для контекстов, не учитывающих DPI, не требуя запускать Visual Studio в режиме, не учитывающем DPI. Чтобы использовать этот параметр в проекте Windows Forms, задайте для свойства ForceDesignerDPIUnawaretrue значение в файле проекта.

Свойство ForceDesignerDpiUnaware проекта поддерживается только для проектов Windows Forms, предназначенных для .NET 6 или более поздней версии. Проекты, предназначенные для .NET Framework (включая .NET Framework 4.8), не используют этот параметр; Конструктор будет продолжать работать с поведением DPI по умолчанию.

<PropertyGroup>
  ...
  <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
</PropertyGroup>

По умолчанию Visual Studio — это приложение с поддержкой точек на дюйм (DPI), что означает автоматическое масштабирование дисплея. Однако конструктор Windows Forms — это приложение, не поддерживающее DPI, поэтому оно отображается как растровое изображение в виде битмапа на 96 DPI. Без поддержки автомасштабирования проблемы и перекрытия возникают при открытии форм на мониторах HDPI, как показано на этом изображении:

Снимок экрана: конструктор Windows Forms на мониторе HDPI, в котором отображаются проблемы из-за отсутствия поддержки автомасштабирования.

При открытии формы в конструкторе Windows Forms на мониторе HDPI Visual Studio отображает информационную панель, отображающую текущий процент масштабирования монитора (например, 150%/144 DPI), возможность перезапуска Visual Studio в 100% масштабирования для сопоставления конструктора Windows Forms и дополнительных сведений. Перезапуск при масштабировании на 100% делает Visual Studio нечувствительным к DPI, позволяя правильную отрисовку без перекрытия.

Скриншот информационной панели в Visual Studio для перезапуска в режиме независимого от DPI.

Подсказка

  1. Если вы закрыли информационный бар и хотите перезапустить Visual Studio в режиме без учета DPI, используйте средство DevEnv.exe.
  2. Если вы не работаете в конструкторе, вы можете игнорировать информационную панель. Вы также можете отключить уведомления , чтобы панель сведений не отображалась.

Перезапуск Visual Studio в качестве процесса без учета DPI

Рекомендуемое решение для устранения этих проблем пользовательского интерфейса — перезапуск Visual Studio как DPI-независимого процесса, что означает перезапуск с масштабированием 100% (96 DPI).

Чтобы переключиться на режим без учета DPI:

  • Выберите параметр "Перезапустить Visual Studio с 100% масштабированием" на желтой панели сведений, которая отображается при открытии формы в конструкторе Windows Forms.

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

Чтобы вернуться к поддержке DPI, выполните следующее:

  • Закройте и снова откройте Visual Studio, чтобы снова вернуться к поддержке DPI. Кроме того, в информационной строке выберите параметр Перезапустить Visual Studio как процесс, поддерживающий DPI.

При запуске Visual Studio без учета DPI проблемы с макетом дизайнера устраняются, однако шрифты могут отображаться размытыми, а проблемы могут проявляться в других дизайнерах, таких как дизайнер XAML. Visual Studio отображает другое информационное сообщение, когда работа в режиме DPI не поддерживается, и сообщает, что "Visual Studio работает как процесс, не поддерживающий DPI". Конструкторы WPF и XAML могут отображаться некорректно.

Замечание

  • Если вы открепите окна инструментов после того как выбрали параметр перезапустить Visual Studio как процесс с отключенной поддержкой DPI, их положение может измениться.
  • Профиль Visual Basic по умолчанию не открывает проекты заново при перезапуске Visual Studio в качестве процесса, не поддерживающего DPI. Вместо этого получите доступ к проекту через Файл>Недавние проекты и решения.

Использование Windows для настройки масштабирования дисплея до 100%

Чтобы избежать использования Visual Studio для переключения масштабирования отображения, настройте масштабирование в параметрах Windows. Например, в Windows 11 можно задать масштабирование до 100% (96 DPI).

Для этого введите параметры отображения в поле поиска панели задач и выберите пункт "Изменить параметры отображения". В окне "Параметры " задайте размер текста, приложений и других элементов на 100%. Помните, что масштабирование 100% (96 DPI) может сделать пользовательский интерфейс слишком небольшим для практического использования.

Отключение масштабирования с помощью средства командной строки DevEnv

Чтобы управлять параметрами отображения с помощью средств командной строки, а не средств пользовательского интерфейса (пользовательского интерфейса), используйте DevEnv.exe. Команда devenv.exe принимает /noscale в качестве параметра командной строки для выполнения в режиме масштабирования 100%. Вот как использовать его:

  1. Выберите Инструменты>Командная строка>Командная строка разработчика в строке меню Visual Studio.
  2. Затем введите devenv /noScale.

Другие варианты

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

Troubleshoot

Если переход на уровень осведомленности о DPI не работает в Visual Studio, убедитесь dpiAwareness , что значение отсутствует в подразделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\devenv.exe в редакторе реестра. Удалите значение, если оно присутствует.