В чем разница между GetClientRect и GetWindowRect в WinApi? - PullRequest
25 голосов
/ 27 сентября 2011

Что из этого я должен использовать в InvalidateRect, чтобы обновить мое окно? А почему?

Ответы [ 4 ]

44 голосов
/ 27 сентября 2011

Прямоугольник окна включает в себя не-клиентскую область, то есть границы окна, строку заголовка и т. Д. Прямоугольник клиента не имеет.

GetWindowRect возвращает прямоугольник в экранных координатах, тогда как GetClientRect возвращает прямоугольник в клиентских координатах.

InvalidateRect получает прямоугольник в клиентских координатах. Если вы хотите аннулировать всю вашу клиентскую область, передайте NULL в InvalidateRect. Вы можете передать прямоугольник, возвращенный GetClientRect, но намного проще и яснее передать NULL.

11 голосов
/ 27 сентября 2011

GetClientRect получает координаты клиентской области окна. В частности, это область внутри окна Chrome, а исключает заголовок и т. Д. Один из комментариев на странице MSDN довольно хорошо подводит итог:

Я бы сказал, что эта функция возвращает размер области, в которую я могу рендерить.

GetWindowsRect получает координаты всего окна. включает заголовок, строку состояния и т. Д. Однако, согласно комментарию на страница MSDN

Приложения под Vista, которые не связаны с WINVER = 6, получат здесь вводящий в заблуждение набор значений, которые не учитывают дополнительное заполнение «стеклянных» пикселей, которые Vista Aero применяет к окну.

Так что, если это не было исправлено для Windows 7, дважды проверьте полученный результат и убедитесь, что у вас есть правильное значение WINVER.

10 голосов
/ 27 сентября 2011

Очень простое объяснение состоит в том, что GetWindowRect() дает вам прямоугольник, который включает в себя границы окна.GetClientRect() дает вам прямоугольник, исключающий границы - область, которая выделена для конкретного чертежа окна.

Обратите внимание, что GetWindowRect() возвращает прямоугольник в экранных координатах - координаты относительно экрана /монитор.GetClientRect() возвращает прямоугольник, относящийся к самому себе.

6 голосов
/ 27 сентября 2011

Из MSDN:
GetWindowRect
Извлекает размеры ограничивающего прямоугольника указанного окна. Размеры указаны в экранных координатах относительно левого верхнего угла экрана.

GetClientRect
Получает координаты клиентской области окна. Координаты клиента указывают верхний левый и нижний правый углы клиентской области. Поскольку координаты клиента относятся к верхнему левому углу клиентской области окна, координаты верхнего левого угла равны (0,0).

Подробнее : прямоугольник клиента не включает строку заголовка, границы, полосы прокрутки, строку состояния ...

...