Масштабирование DPI с помощью windows -генерированных диалогов в C ++? - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь правильно настроить DPI в C ++ для приложения, и у меня возникают проблемы с его настройкой для работы с окном File Picker, созданным из вызова OPENFILENAMEW из commdlg.h.

Я использую три мониторы: два с разрешением 1,0 т / д и один с разрешением 2,5 т / д. Для меня средство выбора файлов открывается только с разрешением 1,0 DPI независимо от того, в каком окне находится мое приложение. Поэтому, когда я перетаскиваю средство выбора файлов на монитор с разрешением 2,5 dpi, окно становится настолько маленьким, что его трудно прочитать. Я могу настроить его на 2,5 dpi только при отключении других мониторов. Я посмотрел документацию для OPENFILENAMEW и есть флаг, позволяющий изменить размер диалога вручную, но это все.

Он должен зарегистрировать dpi в какой-то момент в масштабе, но я просто не могу его найти. Кто-нибудь знает как это сделать?

1 Ответ

0 голосов
/ 13 января 2020

Включение поддержки DPI для каждого монитора в настройках Manifest не решило полностью, но привело к ответу, который я искал! Таким образом, проблема, которая сохранялась, заключалась в том, что после того, как окно средства выбора файлов было создано, оно сохраняло свой масштаб DPI от своего исходного окна даже после перемещения его в окно с другим DPI.

Очевидно, что параметры в манифесте не поддерживают это, равно как и функция SetProcessDpiAwareness в API shellscaling, которая может использоваться для установки этого параметра манифеста программно.

Однако SetProcessDpiAwarenessContext из winuser.h имеет еще одну опцию, которую другие не имеют: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2. Это можно использовать только на windows машинах с обновлением Creators (с именем Redstone 2), и вы можете проверить это, чтобы выполнить масштабирование DPI правильно, когда это возможно, и неправильно, но настолько хорошо, насколько это возможно, когда вы не можете:

if (IsWindowsVersionOrGreater(HIBYTE(NTDDI_WIN10_RS2), LOBYTE(NTDDI_WIN10_RS2), 0)) {
      SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
}
else {
      SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
}

И это работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...