Как создать масштабируемое и изменяющее размер приложение с поддержкой DPI для каждого монитора, обратно совместимое с Windows 7?

Я новичок в WPF (и API-интерфейсах с поддержкой DPI) и пишу приложение для работы в Windows 7, 8.1 и 10. Я использую несколько мониторов с разными настройками DPI для каждого монитора и заинтересован в том, чтобы сделать мое приложение совместим, насколько это возможно, в настольных конфигурациях.

Я уже знаю, что можно добавить манифест в приложение WPF, раскомментировать раздел для осведомленности о DPI и установить его True/PM, Это позволяет программе работать с разрешением Per-Monitor DPI в Windows 8.1 и 10 (таким образом, она выглядит четкой и четкой на разных мониторах), но в Windows 7 работает с учетом системы.

Но можем ли мы сделать один шаг лучше?
Microsoft предоставляет аккуратный учебник, который показывает, как создать Per-Monitor DPI-Aware Приложение WPF.
На самом деле они создают новый объект в C ++ для замены <Window> который использует API-интерфейсы Windows 8.1 не только для определения изменения DPI между мониторами, но и для Изменение размера приложение во время выполнения, эффективно сопоставляя изменение в DPI.
Конечным результатом является то, что приложение не только распознает Per-DPI и хорошо смотрится, но и при переключении между большими и маленькими мониторами разных размеров приложение обращается к пользователю, чтобы изменить один и тот же физический размер (в дюймах или сантиметрах) на экране. ,

Недостатком Microsoft-кода Win32 является то, что он не имеет обратной совместимости с Windows 7. Попытка запустить 7 приводит к сбою приложения.

Я прошел эта статья о Dr.Dobbs а также этот Кенни Карр но не понимаю API достаточно хорошо, чтобы заставить вещи работать.

Кто-нибудь знает способ сделать что-то похожее на код Microsoft, где в Windows 8.1 и новее приложение с поддержкой Per-Monitor будет на самом деле изменить размер при перемещении между мониторами, но работает как System-Aware в Windows 7?

6

Решение

Я не смотрел на код, но я предполагаю, что сбой вызван отсутствием нативных методов в win 7.
Способ исправить это, например, изменить оболочку встроенных методов (псевдокод):

public int GetDPIOfMonitor(IntPtr monitorHandle)
{
if (Enviroment.OSVersion >= "6.2") // win 8 and above
{
return NativeMethods.PInvoke.GetMonitorDPI(monitorHandle);
}
else return systemDPI;
}

Таким образом, вы не столкнетесь с ошибкой до 7, потому что вы не вызываете отсутствующие нативные методы.

-1

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector