The solution is using the combined power of GetWindowRect()
and MapWindowPoints()
.
GetWindowRect()
retrieves the coordinates of a window relative to the entire screen area you see on your monitor. We need to convert these absolute coordinates into relative coordinates of our main window area. The MapWindowPoints()
transforms the coordinates given relative to one window into relative to another. So we need a “handle” of the screen area and the handle of the parent window of the control which we are trying to find coordinates of. The screen are is a “window” in Windows terminology and it is called “Desktop”. We can access the handle of Desktop by the constant HWND_DESKTOP
defined in WinUser.h
(including Windows.h
is enough). And we can get the handle of our parent window simply by calling the Win32 function GetParent()
. Now we have all the parameters required to call the MapWindowPoints()
function.
RECT YourClass::GetLocalCoordinates(HWND hWnd) const
{
RECT Rect;
GetWindowRect(hWnd, &Rect);
MapWindowPoints(HWND_DESKTOP, GetParent(hWnd), (LPPOINT) &Rect, 2);
return Rect;
}
MapWindowPoints()
is defined as:
int MapWindowPoints(
_In_ HWND hWndFrom,
_In_ HWND hWndTo,
_Inout_ LPPOINT lpPoints,
_In_ UINT cPoints
);
MapWindowPoints()
transform the coordinates relatively from hWndFrom
to hWndTo
. In our case, we do the transformation from Desktop (HWND_DESKTOP
) to our parent window (GetParent(hWnd)
). Therefore, the resulting RECT
structure holds the relative coordinates of our child window (hWnd
) relative to its parent window.