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

Получение пользовательского процента DPI в Delphi

Пытаясь использовать приложение Delphi 2010 больше пользователей в режимах с высоким разрешением DPI в Windows 7, я пытался несколько способов извлечь PixelsPerInch и сравнить с 96. Увы, независимо от того, что я пробовал, я всегда получаю 96. Мои вопросы:

  • Какова наилучшая практика для получения пользовательского режима DPI?
  • Является ли факт, что получаю константу 96, независимо от того, что я, что означает, что это означает, что я пропускаю что-то?

Вот что я пробовал

dpiX := Form1.PixelsPerInch

и

dpiX := Screen.PixelsPerInch

и, наконец:

D2DFactoryOptions.DebugLevel := D2D1_DEBUG_LEVEL_NONE;
pD2DFactoryOptions := @D2DFactoryOptions;
if D2D1CreateFactory(
    D2D1_FACTORY_TYPE_SINGLE_THREADED,
    IID_ID2D1Factory,
    PD2DFactoryOptions,
    D2DFactory
    ) <> S_OK then exit;
D2DFactory.GetDesktopDpi(dpiX, dpiY)

Угадать догадаться? что right dpiX является константой 96 в 100%, 125% и 150%

Пожалуйста, совет.

4b9b3361

Ответ 1

Я думаю, вам нужно отметить ваше приложение как высокодоходное DPI, включив его в манифест приложения:

<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>

Подробности об объявлении осведомленности о DPI даны здесь.

Похоже, вы в настоящее время возвращаетесь к тому, что называется Виртуализация DPI.

Ответ 2

Является ли ваше приложение DPI осведомленным? Если нет, объявите это так.

Edit:

Если вы действительно хотите определить текущую настройку, но не хотите включать информацию о DPI для всего своего приложения, тогда лучше всего написать небольшое приложение с поддержкой dpi (dpi), единственной задачей которого является это обнаружение, Запустите его и перенесите результат в основное приложение. Или предоставить пусковую установку, которая обнаруживает, а затем запускает основное приложение, предоставляющее параметр в качестве параметра командной строки. Это, конечно, только если нет другого API или "секретного" вызова, которое может сделать ваше приложение, чтобы определить настройку даже при запуске виртуализованного DPI.

Ответ 3

Вы можете посмотреть значение реестра AppliedDPI в

HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI

Спасибо Андреасу Рейбренду.

Ответ 4

Поскольку среда Delphi IDE даже не дает возможности пометить ваше приложение DPI, поскольку Дэвид показал вам, что вам нужно сделать свой собственный манифест и добавить к нему материал, а потому, что переход в режим DPI Aware означает, что вам придется справитесь с большой работой самостоятельно, вы можете обнаружить, что это просто не стоит. Я, конечно же, отказался от этой попытки после 100 бесплодных часов работы.

Если ваше приложение использовало 100% общих элементов управления, и вы не возражали переделывать все остальные, пока они не работали нормально для вас, а затем идите на него.

Даже элементы управления на основе Common-Control, такие как управление страницей, не работают (по крайней мере, их обертки VCL не работают) хорошо в среде с высоким dpi, когда виртуализация DPI отключена.

Краткая версия: Лучшая практика в наши дни не беспокоит вообще в приложениях VCL, если вы абсолютно не обязаны, а затем вы можете также выделить время для перезаписи и фиксации каждого элемента управления в VCL и каждом стороннем элементе управления, для работы с глюками.

Ответ 5

Не отвечайте на пользовательский параметр DPI.

Отвечайте предпочтение шрифта пользователя.

Если вы ответите только на настройку DPI пользователя, ваша форма не станет больше, если пользователь использует более крупный шрифт, чем вы использовали во время разработки, например.

  • вы создали с 8pt MS Sans Serif или Tahoma.
  • пользователь работает под управлением Windows Vista или Windows 7 (9pt Segoe UI)
  • Вы работаете на моем компьютере (14pt Segoe UI)

Отвечая на размер шрифта (в пикселях), вы получаете бесплатную поддержку высокого уровня (и вы являетесь хорошим разработчиком!):

  • 8pt Tahoma @96dpi: 13px Windows 2000/XP (с чем вы создали)
  • 8pt Tahoma @131dpi: 15px (масштабируйте свою запрограммированную форму на 115%)
  • 9pt Segue UI @96dpi: 15px Windows Vista/7 (масштабируйте свою запрограммированную форму на 115%)
  • 9pt Segoe UI @131dp: 16px моя домашняя машина (масштабируйте форму на 123%)
  • 12pt Tahoma @96dpi: 16px моя рабочая машина (нарисуйте свою разработанную форму на 123%)

Вы хотите отключить всю форму Scaled property; поэтому они не пытаются ответить на настройки dpi. Вы хотите, чтобы .NET WinForms эквивалентен AutoScaleMode.Font.


И да, как только вы заплатите налоги и сможете обрабатывать разные параметры DPI, объявите ваше приложение highDpi с помощью манифеста, как и другие ответы.

Не использовать SetProcessDPIAware, так как может быть слишком поздно для DLL, которые зависят от того, кто уже прочитал текущий DPI:

Примечание. SetProcessDPIAware подвержен возможному состоянию гонки, если DLL кэширует настройки dpi во время инициализации. По этой причине рекомендуется указывать dpi с помощью приложения (.exe), а не путем вызова SetProcessDPIAware.

Ответ 6

В случае, если это помогает кому-то, Я заметил, что Screen- > PrimaryMonitor- > PixelsPerInch DOES изменяются в соответствии с масштабом отображения.