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

Материал из Весельчак У
Версия от 10:15, 29 июля 2008; RXL (обсуждение | вклад) (Новая: ===Если известны абсолютные координаты точки на экране, как перевести эти координаты в относительные ...)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

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

Используя функцию 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 - относительные координаты