Ответ 1
Решение использует объединенную мощность GetWindowRect()
и MapWindowPoints()
.
GetWindowRect()
извлекает координаты окна относительно всей области экрана, которую вы видите на своем мониторе. Нам нужно преобразовать эти абсолютные координаты в относительные координаты нашей основной области окна. MapWindowPoints()
преобразует координаты, заданные относительно одного окна, относительно другого. Поэтому нам нужен "дескриптор" области экрана и дескриптор родительского окна элемента управления, в котором мы пытаемся найти координаты. Экран - это "окно" в терминологии Windows, и он называется "Рабочий стол". Мы можем получить доступ к дескриптору Desktop постоянной константой HWND_DESKTOP
, определенной в WinUser.h
(в том числе Windows.h
). И мы можем получить дескриптор нашего родительского окна, просто вызвав функцию Win32 GetParent()
. Теперь у нас есть все параметры, необходимые для вызова функции MapWindowPoints()
.
RECT YourClass::GetLocalCoordinates(HWND hWnd) const
{
RECT Rect;
GetWindowRect(hWnd, &Rect);
MapWindowPoints(HWND_DESKTOP, GetParent(hWnd), (LPPOINT) &Rect, 2);
return Rect;
}
MapWindowPoints()
определяется как:
int MapWindowPoints(
_In_ HWND hWndFrom,
_In_ HWND hWndTo,
_Inout_ LPPOINT lpPoints,
_In_ UINT cPoints
);
MapWindowPoints()
преобразуют координаты относительно от hWndFrom
до hWndTo
. В нашем случае мы делаем преобразование из рабочего стола (HWND_DESKTOP
) в родительское окно (GetParent(hWnd)
). Поэтому результирующая структура RECT
содержит относительные координаты нашего дочернего окна (hWnd
) относительно его родительского окна.