这次又快又简单。我有一个子类选项卡控件,它处理WM_WINDOWPOSCHANGED,如果不是SWP_NOSIZE,则调整其内容的大小。它将WINDOWPOS lParam的cx和cy字段传递给TCM_ADJUSTRECT以获得内容的rect大小。
我也需要在命令下(例如,在更改选项卡之后)执行此操作。但是,我不能仅仅将虚拟的大小调整到相同的大小;即使使用显式的SetWindowPos(),如果大小不改变,实际的SWP_NOSIZE似乎也会自己添加。因此,我想将类似的代码写到我的WM_WINDOWPOSCHANGED处理程序中。
我的问题是:给定给WM_WINDOWPOSCHANGED的坐标是什么?父坐标还是屏幕坐标?GetWindowRect()返回屏幕坐标,所以我想知道是否需要转换坐标以获得与在WM_WINDOWPOSCHANGED中得到的值相同的值。WM_WINDOWPOSCHANGED的文档没有说明,WINDOWPOS的文档也没有说明。
谢谢。
发布于 2015-04-13 07:11:35
WINDOWPOS, GetWindowRect, GetCursorPos等给出屏幕坐标。当您使用SetWindowPos时,您必须提供与父级相关的坐标。这是直接为主窗口和弹出窗口使用屏幕坐标。对于移动子窗口,可以使用ScreenToClient和ClientToScreen进行转换。
例如,这将在对话框的左上角找到OK按钮的坐标:
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
}现在,我们可以将OK按钮向上移动10 by:
rc.top -= 10;
rc.bottom -= 10;
::SetWindowPos(hitem, 0, rc.left, rc.top, 0, 0, SWP_NOSIZE);https://stackoverflow.com/questions/29598334
复制相似问题