Как настроить приложение для правильной работы на машине с высокой настройкой DPI (например, 150%)?
Я создал простую программу Winforms на С#. Когда я запускаю приложение на машине с высокими настройками DPI (например, 150%), приложение становится масштабированным. Все идет нормально!
Но вместо того, чтобы создавать шрифты с более высоким размером шрифта, все тексты также просто увеличены. Это, конечно, приводит к очень размытому тексту (на всех элементах управления, таких как кнопки и т.д.).
Должны ли окна не заботиться о правильном оформлении текстов? Например, строка заголовка приложения отображается четким и понятным.
Ответы
Ответ 1
После того, как вы пройдете 100% (или 125% с отметкой "Графика DPI в стиле XP"), Windows по умолчанию берет на себя масштабирование вашего пользовательского интерфейса. Это делается, если ваше приложение отображает его вывод в растровое изображение и рисует это растровое изображение на экране. Повторное масштабирование этого растрового изображения делает текст неизбежно выглядящим нечетким. Функция, называемая "виртуализация DPI", позволяет хранить старые программы на мониторах с высоким разрешением.
Вы должны явно сообщить ему, что вы можете обрабатывать более высокие настройки DPI, добавив элемент <dpiAware>
в ваш манифест. Страница MSDN находится здесь, но она не завершена, так как она отключает настройки UAC. Project + Добавить новый элемент, выберите "Файл манифеста приложения". Отредактируйте текст манифеста или скопируйте/вставьте:
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
Вы также можете вывести SetProcessDPIAware() в свой метод Main(), необходимый, например, при развертывании с помощью ClickOnce:
[STAThread]
static void Main() {
if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); // Edit as needed
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
UPDATE, эта общая потребность, наконец, немного проще, если вы используете VS2015 Update 1 или выше. Добавленный манифест уже имеет соответствующую директиву, просто удалите комментарии.
Ключевое слово для поиска, чтобы найти этот пост назад: dpiAware
Ответ 2
Приложения могут быть разработаны в двух разных режимах.
Первый заключается в том, чтобы объявить наше приложение не относящимся к DPI (не объявляя, что все будет по умолчанию). В этом случае операционная система будет отображать наше приложение под ожидаемым 96 DPI, а затем будет работать с масштабированием растрового изображения, о котором мы говорили ранее. Результат будет размытым, но с правильным расположением.
Второй вариант - объявить приложение как DPI-aware. В этом случае ОС не будет делать никакого масштабирования и позволит вашему приложению отображать в соответствии с исходным DPI экрана. В случае среды для каждого монитора-DPI ваше приложение будет отображаться с самым высоким DPI всех экранов, тогда это растровое изображение будет уменьшено до нужного размера для каждого монитора. Уменьшение масштаба приводит к лучшему впечатлению от просмотра, чем к масштабированию, но вы можете заметить некоторую нечеткость.
Если вы хотите этого избежать, вы должны объявить свое приложение как соответствующее монитору-DPI. Затем вы должны обнаружить, когда ваше приложение перетаскивается через разные мониторы и отображает в соответствии с DPI текущего.
Объявление осознания DPI выполняется в файле манифеста.
ссылайтесь на следующую ссылку fooobar.com/questions/95414/...
Ответ 3
Ни одно из этих предложений не работало для меня, но что-то случилось после того, как я удалил Form.Font = new
... из Form.Design.cs
, форма начала правильно масштабироваться, она работает, если Font определен в конструкторе или совсем нет. Зачем? кто-то еще может объяснить, я просто могу поговорить об измененных, которые я сделал, и взял несколько минут, чтобы понять, что это была основная причина для формы, над которой я работал. Надеюсь, поможет.
Ответ 4
Используя.NET Framework 4.7 и Windows 10 Creators Update или новее, вы должны сделать следующее, чтобы настроить поддержку большого DPI для вашего приложения Windows Form:
Объявите совместимость с Windows 10.
Для этого добавьте в файл manifest
:
<compatibility xmlns="urn:schemas-microsoft.com:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Включите распознавание DPI на мониторе в файле app.config
.
Windows Forms представляет новый элемент System.Windows.Forms.ApplicationConfigurationSection для поддержки новых функций и настроек, добавленных начиная с.NET Framework 4.7. Чтобы воспользоваться преимуществами новых функций, поддерживающих высокий уровень DPI, добавьте в конфигурационный файл приложения следующее.
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Важный
В предыдущих версиях.NET Framework вы использовали манифест для добавления высокой поддержки DPI. Этот подход больше не рекомендуется, так как он переопределяет параметры, определенные в файле app.config.
Вызовите статический метод EnableVisualStyles.
Это должен быть первый вызов метода в точке входа приложения. Например:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form2());
}
Преимуществом этого является поддержка динамических сценариев DPI, в которых пользователь меняет коэффициент DPI или масштаб после запуска приложения Windows Forms.
Источник: высокая поддержка DPI в Windows Forms
Ответ 5
По крайней мере, начиная с Visual Studio 2017, вам просто нужно добавить файл манифеста и раскомментировать этот раздел:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>