首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WM_WINDOWPOSCHANGED上的WINDOWPOS中的坐标是在父坐标还是屏幕坐标?

WM_WINDOWPOSCHANGED上的WINDOWPOS中的坐标是在父坐标还是屏幕坐标?
EN

Stack Overflow用户
提问于 2015-04-13 05:21:02
回答 1查看 830关注 0票数 1

这次又快又简单。我有一个子类选项卡控件,它处理WM_WINDOWPOSCHANGED,如果不是SWP_NOSIZE,则调整其内容的大小。它将WINDOWPOS lParamcxcy字段传递给TCM_ADJUSTRECT以获得内容的rect大小。

我也需要在命令下(例如,在更改选项卡之后)执行此操作。但是,我不能仅仅将虚拟的大小调整到相同的大小;即使使用显式的SetWindowPos(),如果大小不改变,实际的SWP_NOSIZE似乎也会自己添加。因此,我想将类似的代码写到我的WM_WINDOWPOSCHANGED处理程序中。

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-13 07:11:35

WINDOWPOS, GetWindowRect, GetCursorPos等给出屏幕坐标。当您使用SetWindowPos时,您必须提供与父级相关的坐标。这是直接为主窗口和弹出窗口使用屏幕坐标。对于移动子窗口,可以使用ScreenToClientClientToScreen进行转换。

例如,这将在对话框的左上角找到OK按钮的坐标:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
rc.top -= 10;
rc.bottom -= 10;
::SetWindowPos(hitem, 0, rc.left, rc.top, 0, 0, SWP_NOSIZE);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29598334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档