Как я могу предотвратить масштабирование элементов пользовательского интерфейса моего приложения Win32, когда установлен высокий DPI?

Когда для Windows установлено значение «изменить размер текста на« 125% », в моем приложении Win32 масштабируется пользовательский интерфейс (но не размер окна). Это приводит к обрезанию текстовых строк и исчезновению элементов пользовательского интерфейса за краем окна.
Я хотел бы предотвратить это, чтобы текст не масштабировался и приложение отображалось правильно. Поскольку время, затрачиваемое на то, чтобы это старое унаследованное приложение должным образом учитывало DPI, слишком велико, и я просто хочу сделать приложение пригодным для использования, не позволяя Windows нарушать пользовательский интерфейс путем изменения размеров элементов пользовательского интерфейса.

Я попытался вызвать SetProcessDPIAware () во время запуска, и когда это не сработало, сигнализируя, что приложение является DPI Aware в своем манифесте. Однако ни одна из этих мер не имеет никакого эффекта.

Кстати, вот фрагмент манифеста, который я использую для определения осведомленности о DPI:

<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<asmv3:application
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

2

Решение

Для масштабирования шрифта 125% настройка с учетом DPI не имеет значения. То, что происходит, — то, что текст будет на 25% больше, и тогда на вас лежит ответственность за то, чтобы расширить ваш пользовательский интерфейс, чтобы соответствовать. Ваши диалоги обычно должны быть на 25% больше, чтобы вместить больший текст. Вам нужно не только масштабировать размеры, но и масштабировать позиции. Это зависит от вас, чтобы закодировать все это. Или используйте UI Framework, который сделает это за вас.

При масштабировании шрифта больше 125% вступает в силу настройка с учетом DPI. Что происходит, это:

  1. Если ваше приложение не помечено как DPI, Windows будет масштабировать его с помощью изменения размера растрового изображения. Это приведет к пикселизации ваших визуальных элементов.
  2. Если ваше приложение помечено как DPI, Windows отобразит его точно. Опять же, на вас лежит ответственность за масштабирование вашего интерфейса в соответствии с текстом.

это Статья MSDN имеет все кровавые детали.

Вернемся к вашему конкретному вопросу. Вы сказали:

Я хотел бы предотвратить это, чтобы текст не масштабировался и приложение отображалось правильно.

Другими словами, вы говорите, что хотели бы игнорировать настройку масштабирования шрифтов пользователя и отображать с разрешением 100% DPI независимо от его пожеланий. Вы можете сделать это, уменьшив размер всего текста на 25%. Я действительно не рекомендую вам это делать.

0

Другие решения

Это всего лишь предупреждение о том, что MFC / Windows 7 ошибочно подозревает эту проблему.

У меня была такая же проблема. Наше (старое) приложение MFC, когда оно запускалось в Windows 7 с установленным шрифтом 125%, отображало диалоговые окна неправильного размера. Элементы управления были масштабированы, но каждый диалог был на 25% слишком маленьким.

Сначала я искал в диалоговом коде все, что могло бы установить его размер / положение. Затем я увидел, что у многих людей в сети были проблемы с размерами диалогов при переносе приложений MFC на Windows 7, что ложно увеличило мои подозрения в отношении MFC / Windows 7.

Наконец, я прочитал аналогичное обсуждение и нашел комментарий от разработчика spy ++ о том, что функция, в которой он сохраняет размер / позицию при выходе, приводила к изменению размера окна после изменения шрифта / DPI. Наше программное обеспечение делало то же самое, но код был в основном приложении, а не в диалогах.

0

По вопросам рекламы [email protected]