首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GetWindowRect坐标与屏幕无关

GetWindowRect坐标与屏幕无关
EN

Stack Overflow用户
提问于 2014-10-06 16:05:56
回答 3查看 2.1K关注 0票数 3

我在Visual 2008 C++工作。我有一个MFC对话框,里面有一个控件。我正在尝试在控件中定位另一个对话框。

第二个对话框上的SetWindowPos()显然使用屏幕坐标,所以我需要获得控件或父对话框的屏幕坐标。MSDN文档说,GetWindowRect()提供了“相对于显示屏幕左上角的屏幕坐标”,但这不是我要得到的。在控件上,它给出相对于父控件的坐标。在父级上,它给出了left=0和top=0。我也尝试过GetWindowPlacement()中的矩形,它也给出了同样的内容。一切都是相对于父母的。

为什么GetWindowRect()不返回屏幕相对坐标?还有别的办法来抓他们吗?

我不是编程新手,而是Windows编程、Visual和MFC的新手,所以我可能遗漏了一些显而易见的东西。

下面是我在OnInitDialog中为父对话框所做的工作:

代码语言:javascript
运行
复制
// TestApp message handlers

BOOL TestApp::OnInitDialog()
{
    CDialog::OnInitDialog();

    FILE * pFile = fopen("out.txt","w");
    CRect winRect;
    GetWindowRect(&winRect);
    fprintf(pFile,"left=%li top=%li right=%li bottom=%li\n",winRect.left,winRect.top,winRect.right,winRect.bottom); fflush(pFile);
    fclose(pFile);

    return TRUE;  // return TRUE  unless you set the focus to a control
}

运行时,对话框不会出现在屏幕的左上角,但是out.txt包含:

代码语言:javascript
运行
复制
left=0 top=0 right=297 bottom=400
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-06 17:38:37

另一份答复中写道:

在窗口移动到其最终位置之前,OnInitDialog被称为。如果稍后调用GetWindowRect,您将看到它返回正确的坐标。

只需将PostMessage与WM_APP+n消息一起使用即可。此消息将在消息泵运行时到达,而消息将在窗口定位并显示在屏幕上时到达。

或者用计时器。这也有同样的效果。

票数 1
EN

Stack Overflow用户

发布于 2014-10-07 07:20:21

在对话框显示之前,框架将调用OnInitDialog。在这一点上,不知道最终的大小或位置:

Windows在WM_INITDIALOG、CreateIndirectDoModal调用期间将消息发送到对话框,这些调用发生在对话框显示之前。

对话框的最终大小和位置是窗口定位协商的结果。发送到可用信息的对话框的第一条消息是WM_WINDOWPOSCHANGED。使用MFC,将通过CWnd::OnWindowPosChanged处理此消息。可以通过重写OnWindowPosChanged类中的CDialog-derived类来实现自定义处理代码。

票数 2
EN

Stack Overflow用户

发布于 2014-10-06 17:23:32

在将窗口移动到其最后位置之前调用OnInitDialog。如果稍后调用GetWindowRect,您将看到它返回正确的坐标。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26220252

复制
相关文章

相似问题

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