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 - относительные координаты