Событие WM_DPICHANGED, предлагающее плохую новую позицию для окна

У меня есть два монитора, подключенных к моему рабочему столу. Главный монитор 3840×2160 слева настроен на масштабирование 150% (144 DPI), а монитор 1920×1080 справа настроен на масштабирование 100% (96 DPI). Выровнены по нижнему краю. Это в Windows 8.1, но та же проблема возникает в Windows 10.

Мое приложение — C ++, использующее родные окна Win32. Он настроен на DPI каждого монитора.

У меня есть диалоговое окно, которое представляет собой окно без полей (кроме строки заголовка) с пользовательской строкой заголовка внутри клиентской области. Пользователь может перетащить эту пользовательскую строку заголовка, чтобы переместить окно, и внутренне оно перемещается с помощью SetWindowPos ().

Когда это окно перетаскивается с левого монитора с высоким разрешением на обычный монитор справа, я получаю сообщение WM_DPICHANGED. Текущий RECT для окна:
curRect = {LeftTop (3527, 1099) RightBottom (4157, 2098) WidthHeight [630 x 999]}

Новый предложенный RECT, который мне дает сообщение WM_DPICHANGED:
newRect = {LeftTop (3527, 1099) RightBottom (3947, 1765) WidthHeight [420 x 666]}

Если я передаю новый RECT в SetWindowPos, как предлагает документация для WM_DPICHANGED, то окно теперь снова рассматривается на моем мониторе с высоким DPI, и в SetWindowPos () я получаю другое сообщение WM_DPICHANGED, говорящее мне о необходимости изменить окно pos / size снова , Это происходит до того, как мое первоначальное событие WM_DPICHANGED вернулось.

Это имеет смысл, основываясь на новом предложенном RECT, так как левый край не перемещается, но ширина уменьшается.
Сообщение WM_DPICHANGED для того же окна не имеет этой проблемы, если я использую фактическую заголовок не-клиента. Левый край перемещается в новом предложенном RECT.

Любые предложения о том, как справиться с этим? Любой способ минимально изменить новое предложение RECT таким образом, чтобы оно гарантировало, что окно w / h соответствует предложенному, но оно расположено так, что не запускает другое событие DPICHANGED (остается на новом мониторе).

Спасибо!

2

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]