Я новичок в осведомленности о DPI.
Я активировал поддержку каждого монитора, добавил обработку сообщений WM_DPICHANGED и столкнулся с проблемами.
- Во время запуска приложения мне нужно обработать сообщения WM_DPICHANGED с аргументами WPARAM и LPARAM, равными нулю
- Имея два монитора, настроенных с разными масштабами изображения (150/175), я ожидаю получить DPI с поддержкой монитора, используя
GetDeviceCaps
, если окно, с которого я использую DC, находится на этом мониторе, но я всегда получаю один и тот же DPI значение 144 (150%).
- При запросе монитора отображается окно, и для его текущих настроек отображения также отображается только 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