WINDOWPOS on WM_WINDOWPOSCHANGED 中的坐标是父坐标还是屏幕坐标?

Are the coordinates in WINDOWPOS on WM_WINDOWPOSCHANGED in parent coordinates or screen coordinates?

这次简单快捷。我有一个子类选项卡控件,它处理 WM_WINDOWPOSCHANGED,当不是 SWP_NOSIZE 时,调整其内容的大小。它将 WINDOWPOS lParamcxcy 字段传递给 TCM_ADJUSTRECT 以获取内容矩形大小。

我也需要根据命令执行此操作(例如,在更改选项卡之后)。但是,我不能只将虚拟大小调整为相同大小;即使使用明确的 SetWindowPos(),如果大小不变,真实的 Windows 似乎也会添加 SWP_NOSIZE 本身。所以我想将类似的代码写入我的 WM_WINDOWPOSCHANGED 处理程序。

我的问题是:WM_WINDOWPOSCHANGED中给定的坐标是什么坐标系,父坐标还是屏幕坐标? GetWindowRect() returns 屏幕坐标,所以我想知道是否需要转换坐标以获得与 WM_WINDOWPOSCHANGED 中相同的值。 WM_WINDOWPOSCHANGED 的文档没有说明; WINDOWPOS.

的文档也没有

谢谢。

WINDOWPOS, GetWindowRect, GetCursorPos等给出屏幕坐标。当您使用 SetWindowPos 时,您必须提供相对于父级的坐标。这对于使用屏幕坐标的 main window 和 popup windows 是直接的。对于移动子windows,可以使用ScreenToClientClientToScreen进行转换。

例如,这将找到确定按钮相对于对话框左上角的坐标:

RECT rcOK; 
HWND hitem = ::GetDlgItem(m_hWnd, IDOK);
GetWndRect(rcOK, hitem, m_hWnd);

void GetWndRect(RECT &rect, HWND item, HWND parent)
{
    ::GetWindowRect(item, &rect);//screen coordinates of OK button

    POINT offset{ 0 };
    ClientToScreen(parent, &offset); //Top-left (0,0) of client area of dialog -> screen coordinates

    rect.left -= offset.x;
    rect.right -= offset.x;
    rect.top -= offset.y;
    rect.bottom -= offset.y;
    //client coordinates of OK button in relation to Dialog's Top-Right
}

现在我们可以将确定按钮向上移动 10px:

rc.top -= 10;
rc.bottom -= 10;
::SetWindowPos(hitem, 0, rc.left, rc.top, 0, 0, SWP_NOSIZE);