Windows Настольная система координат выключена наверняка windows - PullRequest
0 голосов
/ 16 марта 2020

У меня возникла проблема при разработке программного обеспечения для windows, связанная с перемещением windows на экране.

По сути, я обнаружил, что спецификация c windows не будет следовать системе координат. У меня есть функция, которая принимает окно и отношение, затем масштабирует окно до максимального размера, которым оно может быть (в этом соотношении), и при этом остается в рабочей области монитора (не выходя за края или панель задач).

Пример 1: функция работает как задумано, размер окна (VSCode) соответствует максимальному размеру, который может быть в 4: 3, и помещает его в угол экрана (используя SetWindowPos и ​​передавая в 0 , 0 для координат).

image

Example 2: The exact same function is run on a different window (Firefox) and it is again resized to 4:3 and set to 0,0. However, this time you can see the window isn't quite in the corner, off by 8 pixels to be exact. If I fetch the window position with the api call for that, it returns 0,0, even though it clearly is not. If I manually snap it into the corner myself, then it returns -8,0.

image

I have no idea what's wrong or how to fix it. It always happens on the same windows, not exactly sure but I think it has something to do with the type of titlebar the window has.

The only other person I've ever seen with this problem is here: https://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_desktop/desktop-coordinate-system-is-broken/9e6fd9ab-6d27-45e0-bb55-4c868cd6ac45

К сожалению, он так и не получил реального ответа, поэтому я вернулся к исходной точке.

Итак, есть ли какие-нибудь идеи о том, как последовательно установить windows на самом деле в углу? Я придумал некоторые изящные решения, например, пытаясь динамически определить, насколько окно смещается от угла, но на самом деле я не хочу на это полагаться. Это просто ошибка с windows и я застрял?

Спасибо, дайте мне знать, если у вас есть какие-либо вопросы!

1 Ответ

1 голос
/ 16 марта 2020

Это проект системы windows.

Я долго видел похожие вопросы a go.

Windows 10 имеет тонкие невидимые границы слева, справа и снизу , он используется, чтобы захватить мышь для изменения размера. Границы могут выглядеть следующим образом: 7,0,7,7 (слева, сверху, справа, снизу).

Границы невидимы в Windows 10, поэтому кажется, что окно неправильно место. Visual Studio IDE имеет свой собственный инструмент - windows, когда окно инструментов закреплено, оно не использует границ или пользовательских NC_PAINT; и когда его окно инструментов является плавающим, оно использует границы по умолчанию.

A workaroud:

RECT rect, frame;
GetWindowRect(hwnd, &rect);
DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &frame, sizeof(RECT));

//rect should be `0, 0, 1280, 1024`
//frame should be `7, 0, 1273, 1017`

RECT border;
border.left = frame.left - rect.left;
border.top = frame.top - rect.top;
border.right = rect.right - frame.right;
border.bottom = rect.bottom - frame.bottom;

//border should be `7, 0, 7, 7`

Затем сместите прямоугольник следующим образом:

rect.left -= border.left;
rect.top -= border.top;
rect.right += border.left + border.right;
rect.bottom += border.top + border.bottom;

//new rect should be `-7, 0, 1287, 1031`

Для более информацию, пожалуйста, смотрите @ ответ Бармака Шемирани .

Аналогичный случай:

Получить размер окна без Windows Тени

GetWindowRect возвращает размер, включающий «невидимые» границы

Примечание: DwmGetWindowAttribute() возвращает физические координаты, но GetWindowRect() возвращает логические координаты. Таким образом, ширина границы будет неправильной для приложений, не поддерживающих DPI, на экране, масштаб которого будет превышать 100%.

...