Ошибка координаты при использовании GetWindowRect в другом DPI

Я хочу захватить координаты компонентов в моей программе MFC.

Теперь я могу прекрасно это сделать, используя GetWindowRect,
Тем не менее, когда я устанавливаю свои окна dpi на 150% (120 точек на дюйм), я получаю разные координаты GetWindowRect,

Поэтому я рассматриваю некоторый метод для преобразования новых координат в координаты по умолчанию (96 точек на дюйм).

Наконец, я обнаружил ошибку при попытке:

Rect.top = Rect.top * (DEFAULT_DPIY / CURRENT_DPIY);
Rect.left = Rect.left * (DEFAULT_DPIX / CURRENT_DPIX);

Преобразованное значение очень близко, но не равно.

Есть ли способ конвертировать его без ошибок?

0

Решение

Ваша программа подвержена виртуализации DPI. Правильный способ справиться с этим — сделать вашу программу осведомленной о высоком разрешении, но это может повлечь за собой больше изменений, чем вы готовы предпринять.

Если вы не хотите решать проблему с высоким разрешением, вы можете, по крайней мере, улучшить свою арифметику. Ваш код использует целочисленное деление. Но это будет неточно. Чтобы минимизировать эту неточность, вы должны выполнить деление после умножения:

Rect.top = (Rect.top * DEFAULT_DPIY) / CURRENT_DPIY;
Rect.left = (Rect.left * DEFAULT_DPIX) / CURRENT_DPIX;

Конечно, круглые скобки могут быть опущены здесь без изменения смысла, но я думаю, что было бы хорошо четко указать порядок операций в этом случае.

Другой вариант будет использовать MulDiv:

Rect.top = MulDiv(Rect.top, DEFAULT_DPIY, CURRENT_DPIY);
Rect.left = MulDiv(Rect.left, DEFAULT_DPIX, CURRENT_DPIX);
4

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


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