WINDOWPOS on WM_WINDOWPOSCHANGED 中的坐标是父坐标还是屏幕坐标?
Are the coordinates in WINDOWPOS on WM_WINDOWPOSCHANGED in parent coordinates or screen coordinates?
这次简单快捷。我有一个子类选项卡控件,它处理 WM_WINDOWPOSCHANGED
,当不是 SWP_NOSIZE
时,调整其内容的大小。它将 WINDOWPOS
lParam
的 cx
和 cy
字段传递给 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,可以使用ScreenToClient
和ClientToScreen
进行转换。
例如,这将找到确定按钮相对于对话框左上角的坐标:
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);
这次简单快捷。我有一个子类选项卡控件,它处理 WM_WINDOWPOSCHANGED
,当不是 SWP_NOSIZE
时,调整其内容的大小。它将 WINDOWPOS
lParam
的 cx
和 cy
字段传递给 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,可以使用ScreenToClient
和ClientToScreen
进行转换。
例如,这将找到确定按钮相对于对话框左上角的坐标:
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);