Это проект системы 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%.