Windows: WM_DPICHANGED и запрос DPI от монитора / DC отличаются - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в осведомленности о DPI.

Я активировал поддержку каждого монитора, добавил обработку сообщений WM_DPICHANGED и столкнулся с проблемами.

  1. Во время запуска приложения мне нужно обработать сообщения WM_DPICHANGED с аргументами WPARAM и LPARAM, равными нулю
  2. Имея два монитора, настроенных с разными масштабами изображения (150/175), я ожидаю получить DPI с поддержкой монитора, используя GetDeviceCaps, если окно, с которого я использую DC, находится на этом мониторе, но я всегда получаю один и тот же DPI значение 144 (150%).
  3. При запросе монитора отображается окно, и для его текущих настроек отображения также отображается только 144 DPI, даже если для него установлено значение 168 DPI (175%).

Сначала код, который я использую для получения в WM_DPICHANGED зависимых от контекста устройства LOGPIXELS:

CDC* const pDC = GetDC();
const int nDcDpi = GetDeviceCaps(*pDC, LOGPIXELSX);
ReleaseDC(pDC);

Способ получения зависимого от монитора DPI при обработке WM_DPICHANGED:

HMONITOR hMonitor = MonitorFromWindow(GetSafeHwnd(), MONITOR_DEFAULTTONULL);
MONITORINFOEX mix;
mix.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hMonitor, &mix);

DEVMODE dm{ sizeof(DEVMODE) };
EnumDisplaySettings(mix.szDevice, ENUM_CURRENT_SETTINGS, &dm);

const WORD  nDmDpi = dm.dmLogPixels;

Значение DPI, предоставленное обработчику WM_DPICHANGED, я получаю следующим образом:

const WORD  nWmDPI = LOWORD(wParam);

Если главное окно моего приложения перемещается из Monitor 1 (144 DPI) в Monitor 2 (168 DPI), результаты в обработчике WM_DPICHANGED будут такими:

  • 144 DPI от DEVMODE
  • 144 DPI от HDC
  • 168 DPI от WM_DPICHANGED

Может кто-нибудь здесь объяснить мне различия?

И - если приложение запускается, как получить правильный «коэффициент масштабирования», правильное значение DPI, если GetDeviceCaps не возвращает правильное значение?

Заранее спасибо!

С уважением,

Martin

...