FAQ:WinAPI VCPP:преобразование абсолютных координат экрана в относительные координаты окна

Материал из Весельчак У

Перейти к: навигация, поиск

Если известны абсолютные координаты точки на экране, как перевести эти координаты в относительные координаты некоторого известного окна?

Используя функцию API, проецирующую точки одного окна на другое:

WINUSERAPI int WINAPI MapWindowPoints(
HWND hWndFrom, //хендл окна "откуда"
HWND hWndTo, //хендл окна "куда"
LPPOINT lpPoints, //указатель на массив POINT[]
UINT cPoints); //размер массива
 
//для абсолютных координат задать хендл==0 или HWND_DESKTOP

Или аналогичные функции MFC класса CWnd:

HWND_DESKTOP
void MapWindowPoints(
CWnd* pwndTo,
LPPOINT lpPoint,
UINT nCount) const;
void MapWindowPoints(
CWnd* pwndTo,
LPRECT lpRect) const;
//для абсолютных координат задать pwndTo==0

Пример: определяем, какие относительные координаты имеют текущее положение курсора в окне, адрес которого содержится в указателе CWnd* pWnd:

//определяем абсолютные координаты, текущего
//положения курсора
POINT pnt;
::GetCursorPos(&pnt);
 
//проецируем на окно *pWnd (через API функцию)
::MapWindowPoints(HWND_DESKTOP, pWnd->m_hWnd, &pnt, 1);
 
//pnt - относительные координаты