Устранение неполадок виртуализации DPI и приложений с поддержкой DPI в Windows Vista и Windows 7

У меня проблема, когда приложение (написанное на 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 вызывает проблему, тогда как в некоторых формах она устраняет ее:

DPI Glitch Example with a non-DPI-virtualized app manifest, but main form is Scaled

Обновление: оказывается, что некоторые из моих элементов управления используют GDI +, и поведение шрифта в контекстах GDI + отличается от шрифта поведение в обычных контекстах GDI, по крайней мере, для некоторых сторонних элементов управления, которые используют GDI +. Это главный источник головной боли. Во-вторых, в VCL присутствует неоднородное тестовое покрытие и плохо определенные требования к осведомленности о DPI. Некоторые элементы управления VCL основаны на общих элементах управления MS, и хотя справедливо будет сказать, что базовые общие элементы управления, вероятно, нормально работают в ситуациях с высоким разрешением, не все оболочки элементов управления VCL могут быть гарантированно правильно работать. Итак, проверив приложение на предмет высокой осведомленности о DPI во всех его элементах управления, а также правильное поведение во всех доступных темах Windows 7:

  1. аэродинамическое стекло включено, с разрешением 96 точек на дюйм (внешний вид Win7 по умолчанию на большинстве современного оборудования)
  2. базовая тема (аэродинамическое стекло выключено), но темы XP включены
  3. классический вид win2000 где стекло выключено, а также темы уровня xp,
  4. высококонтрастный белый
  5. высококонтрастный черный
  6. Различные настройки, отличные от 96-DPI

.. и этот список можно продолжить., и вы иметь довольно тяжелое бремя как разработчик приложений. Независимо от того, являетесь ли вы пользователем delphi и используете VCL, или вы разработчик MFC / ATL C ++, мне кажется, что поддержка всех различных необычных режимов Windows - это слишком тяжелое бремя, чтобы нести его. Так что большинство людей не беспокоит. Я прав?

18
задан Warren P 24 February 2011 в 17:19
поделиться