How do I find position of a Win32 control/window relative to its parent window?

position, win32gui, winapi, window

Solution

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.

Problem

Given handle of a Win32 window, I need to find position of it relative to its parent window. I know several functions (e.g.; `GetWindowRect()` and `GetClientRect()`), but none of them explicitly return the desired coordinates. How do I do this?

Original source