У меня проблема, когда приложение (написанное на Delphi) ведет себя правильно в по умолчанию 96 точек на дюйм для всех систем, но ведет себя непоследовательно при настройке «150% размера текста» (внутреннее 144 точек на дюйм) в разных системах. Кажется, что в некоторых системах некоторые части текста / шрифта моего приложения растягиваются, а в других - нет. Я бы подумал, что мое приложение в определенной версии Windows (Win7) с определенным DPI, должно вести себя так же.
Либо мое приложение сообщит Windows, что ему не нужна функция виртуализации DPI, либо не будет. Это я понимаю. Чего я не понимаю, так это того, как изменения DPI могут вызывать различный вид на двух машинах, работающих под управлением Windows 7, с разрешением 144 dpi, отображая одни и те же шрифты и формы с одинаковыми фиксированными размерами.
Существуют ли некоторые элементы, зависящие от конфигурации. участвует в виртуализации DPI, которую мне нужно проверить в Windows (реестр и т. д.)? В противном случае, как вы устраняете неполадки и знаете, выполняется ли виртуализация DPI в вашем клиентском окне?
В Delphi необходимо установить для свойства TForm.Scaled значение false, если не требуется масштабирование. Но я не понимаю, что когда свойство Scaled главной формы истинно, я не всегда могу предсказать результат.
Что меня больше всего сбивает с толку в моем приложении, так это то, что у меня есть элемент управления, который плохо себя ведет только в моем большом реальном приложении, но который не ведет себя неправильно в отдельном приложении, где я пытаюсь отладить только элемент управления. Чтобы понять поведение элемента управления в автономном приложении, я был вынужден создать демонстрационное приложение, в котором я принудительно использую осведомленность о DPI через файл манифеста. Затем я могу воспроизвести сбой при рисовании элемента управления, хотя и в другой форме.
Вот файл манифеста, который я использую в своем демонстрационном приложении, который раскрывает проблемы, которые мои элементы управления имеют при работе с настройками высокого разрешения в Windows. Однако я обнаружил одну странную вещь: для приложения
<?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 присутствует неоднородное тестовое покрытие и плохо определенные требования к осведомленности о DPI. Некоторые элементы управления VCL основаны на общих элементах управления MS, и хотя справедливо будет сказать, что базовые общие элементы управления, вероятно, нормально работают в ситуациях с высоким разрешением, не все оболочки элементов управления VCL могут быть гарантированно правильно работать. Итак, проверив приложение на предмет высокой осведомленности о DPI во всех его элементах управления, а также правильное поведение во всех доступных темах Windows 7:
.. и этот список можно продолжить., и вы иметь довольно тяжелое бремя как разработчик приложений. Независимо от того, являетесь ли вы пользователем delphi и используете VCL, или вы разработчик MFC / ATL C ++, мне кажется, что поддержка всех различных необычных режимов Windows - это слишком тяжелое бремя, чтобы нести его. Так что большинство людей не беспокоит. Я прав?