Подтвердить что ты не робот

Как настроить приложение для правильной работы на машине с высокой настройкой DPI (например, 150%)?

Я создал простую программу Winforms на С#. Когда я запускаю приложение на машине с высокими настройками DPI (например, 150%), приложение становится масштабированным. Все идет нормально! Но вместо того, чтобы создавать шрифты с более высоким размером шрифта, все тексты также просто увеличены. Это, конечно, приводит к очень размытому тексту (на всех элементах управления, таких как кнопки и т.д.).

Должны ли окна не заботиться о правильном оформлении текстов? Например, строка заголовка приложения отображается четким и понятным.

4b9b3361

Ответ 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>