В процессе Win81+, не поддерживающем dpi, определите коэффициент масштабирования.

У меня проблема в том, что я пишу код для процесса, не поддерживающего dpi, пока не появится исправление ошибки.

Так что на данный момент мне нужно сделать работу вокруг. Моя мысль такова: выясните коэффициент масштабирования и дайте моим элементам ширину/высоту, уменьшенную на столько.

Итак, прямо сейчас я рисую холст размером во всю ширину и высоту второго монитора, его размер 1920 x 1080 (ШхВ). Но визуально (по фотошопу после скриншота) получается 2880 x 1620. Это коэффициент масштабирования, равный 1,5 (2880 разделить на 1920 или 1620 разделить на 1080).

Я пытался получить dpi с помощью методов GetDeviceCaps и EnumDisplaysettings, но все они вернули значение основного монитора (примечание: EnumDisplaySettings устанавливает dmLogPixels, который, я думаю, равен 0, если я делаю EnumDisplaySettings с constnat ENUM_REGISTRY_SETTINGS, поэтому мне пришлось использовать ENUM_CURRENT_SETTINGS).

Единственный метод, который я обнаружил, который возвращает по-разному, — это GetDpiForMonitor с MONITOR_DPI_TYPE constnat MDT_Angular_DPI или MDT_Raw_DPI, если я использую MDT_Effective_DPI, он дает значение основного монитора.

Итак, вот мои результаты запуска GetDpiForMonitor:

Ни одно из вторичных значений, разделенных на первичное, не дает мне коэффициент масштабирования 1,5. Есть ли способ получить этот коэффициент масштабирования?

Спасибо


person Noitidart    schedule 20.07.2015    source источник
comment
msdn.microsoft.com/ en-us/library/windows/desktop/   -  person Hans Passant    schedule 20.07.2015
comment
Спасибо @HansPassant!   -  person Noitidart    schedule 20.07.2015
comment
@HansPassant, мой способ использования EnumDisplaySettings был крутым, если для DPI было установлено значение по умолчанию. Если пользователь переходит на панель и увеличивает текст, он не будет работать должным образом. Итак, я хотел использовать вашу функцию LogicalToPhysicalPointForPerMonitorDPI, но для этого ей нужно hwnd в окно. Есть ли способ передать ему hmon монитора?   -  person Noitidart    schedule 30.10.2015


Ответы (1)


У меня просто возникла идея, и это работает. Я получаю масштабированную высоту/ширину с помощью любого из трех методов, описанных в моем вопросе здесь: Неправильная ширина и высота второго монитора из GetMonitorInfo и GetDeviceCaps

  • GetDeviceCaps on hdcScreen or
  • GetMonitorInfo or
  • EnumDisplayMonitors

Затем я делю его на ширину/высоту из EnumDisplaySettings.

Это единственный способ, который я нашел, как, есть ли другой способ? Может специалисты подтвердят.

person Noitidart    schedule 20.07.2015