У меня проблема, когда приложение (написанное в Delphi) ведет себя правильно по умолчанию по умолчанию 96 DPI во всех системах, но ведет себя непоследовательно при настройке "150% размер текста" (внутренне 144 dpi) в разных системах. Похоже, что в некоторых системах некоторые части текста/шрифта моего приложения растягиваются, а в других системах - нет. Я бы подумал, что мое приложение на определенной версии Windows (Win7) в определенном DPI должно вести себя одинаково.
Либо мое приложение сообщит Windows, что ему не нужна функция виртуализации DPI, либо она не будет. Я так понимаю. Я не понимаю, как изменения DPI могут вызывать различный внешний вид на двух машинах, работающих под управлением Windows 7, как при 144 dpi, так и в тех же шрифтах и формах с одинаковыми фиксированными размерами.
Существуют ли зависящие от конфигурации элементы, связанные с виртуализацией DPI, которые мне нужно проверять в Windows (реестр и т.д.)? В противном случае, как вы устраните неполадку и узнаете, выполняется ли виртуализация DPI в окне вашего клиента?
В Delphi необходимо установить для свойства TForm.Scaled значение false, если вы не хотите масштабирования. Но я не понимаю, что, когда свойство основной формы Scaled истинно, я не всегда могу предсказать результат.
Что мне больше всего неприятно в моем приложении, так это то, что у меня есть элемент управления, который имеет только ошибки в моем большом реальном приложении, но который не ошибочно работает в автономном приложении, где я пытаюсь отлаживать только элемент управления. Чтобы понять поведение управления в автономном приложении, я был вынужден сделать демонстрационное приложение, в котором я принудительно передаю сообщение 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>
<assemblyIdentity version="14.0.3615.26342" processorArchitecture="*"
name="TestProject" type="win32"></assemblyIdentity>
<description>High DPI Controls Test App</description>
</assembly>
здесь пример одного из около 30 мест, где элементы управления в моем приложении перепутаны, когда я отключил виртуализацию DPI в своем приложении. Этот конкретный глюк был разрешен путем отключения свойства Scaled в моей форме. Но в других местах, когда TForm.Scaled = false вызывает проблему, тогда как в некоторых формах она исправляет ее:
Обновление. Оказывается, некоторые из моих элементов управления используют GDI +, а поведение шрифтов в контекстах GDI + отличается от поведения шрифтов в обычных контекстах GDI, по крайней мере для некоторых сторонних элементов управления, которые используют GDI+. Это главный источник головных болей. Во-вторых, в VCL есть пятнистое тестовое покрытие и плохо определенные требования для осведомленности о ДОИ. Некоторые элементы управления VCL основаны на общих элементах управления MS, и, хотя справедливо утверждать, что базовые общие элементы управления, вероятно, отлично работают в ситуациях с высоким уровнем DPI, можно гарантировать, что не все обертки управления VCL могут работать правильно. Итак, просмотрите приложение для повышения уровня DPI во всех его элементах управления, а также правильное поведение во всех доступных окнах 7 тем:
- aero glass on, при 96dpi (внешний вид Win7 на большинстве современных аппаратных средств)
- основная тема (выключено aero glass), но включены темы xp.
- классический win2000 посмотреть, где стекло выключено, а также темы уровня xp,
- высококонтрастный белый
- высококонтрастный черный
- Различные настройки, отличные от 96-DPI
.. и список продолжается. И у вас довольно тяжелое бремя, как разработчик приложения. Являетесь ли вы пользователем delphi и используете VCL, или вы являетесь разработчиком MFC/ATL С++, мне кажется, что поддержка всех различных причудливых оконных режимов - это слишком тяжелое бремя. Поэтому большинство людей не беспокоится. Я прав?