|
|
От: |
Философ
|
http://vk.com/id10256428 |
| Дата: | 10.10.25 08:43 | ||
| Оценка: | |||
Что не так в этой функции? Мне кажется, она неверно получает прямоугольник с вертикальным скроллбаром.
RECT GetVerticalScrollBarRect(HWND hwnd) { RECT clientRect; GetClientRect(hwnd, &clientRect); RECT scrollRect = clientRect; scrollRect.left = scrollRect.right - GetSystemMetrics(SM_CXVSCROLL); return scrollRect; }
Функция не учитывает рамки окна и может получать некорректные координаты. Вертикальный скроллбар находится в клиентской области, но координаты клиентского rect начинаются с (0,0). Для правильной работы нужно преобразовать координаты в экранные или оконные:...
...
...
...
**Нет, вертикальный скроллбар находится в НЕклиентской области окна.**
Скроллбары являются частью неклиентской области, так же как:
— заголовок окна (title bar)
— рамки (borders)
— меню (menu bar)
— кнопки minimize/maximize/close
**Клиентская область** — это внутренняя часть окна, где отрисовывается содержимое приложения.
**Неклиентская область** — это все системные элементы управления окном, включая скроллбары.
Поэтому ваша исходная функция, которая использует `GetClientRect()`, не сможет правильно получить прямоугольник скроллбара. Нужно использовать `GetWindowRect()` и работать с координатами всего окна.