Я хочу захватить координаты компонентов в моей программе MFC.
Теперь я могу прекрасно это сделать, используя GetWindowRect
,
Тем не менее, когда я устанавливаю свои окна dpi на 150% (120 точек на дюйм), я получаю разные координаты GetWindowRect
,
Поэтому я рассматриваю некоторый метод для преобразования новых координат в координаты по умолчанию (96 точек на дюйм).
Наконец, я обнаружил ошибку при попытке:
Rect.top = Rect.top * (DEFAULT_DPIY / CURRENT_DPIY);
Rect.left = Rect.left * (DEFAULT_DPIX / CURRENT_DPIX);
Преобразованное значение очень близко, но не равно.
Есть ли способ конвертировать его без ошибок?
Ваша программа подвержена виртуализации 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);