GetWindowRect坐标不是屏幕相关的

时间:2014-10-06 16:05:57

标签: c++ visual-studio-2008 mfc

我在Visual Studio 2008 C ++中工作。我有一个MFC对话框,里面有一个控件。我试图在控件中放置另一个对话框。

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

为什么GetWindowRect()没有返回屏幕相对坐标?还有另一种方式来获取它们吗?

我不是新手编程,但对Windows编程,Visual Studio和MFC来说还不是新手,所以我可能会遗漏一些明显的东西。

以下是我在OnInitDialog中为父对话框做的事情:

// 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包含:

left=0 top=0 right=297 bottom=400

3 个答案:

答案 0 :(得分:0)

在窗口移动到其最终位置之前,

OnInitDialog被称为。如果您稍后致电GetWindowRect,您会看到它返回正确的坐标。

答案 1 :(得分:0)

如其他答案所述:

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

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

或使用计时器。这具有相同的效果。

答案 2 :(得分:0)

在显示对话框之前,框架会调用

OnInitDialog。此时,最终大小和位置都不知道:

  

Windows会在显示对话框之前的CreateCreateIndirectDoModal来电期间向对话框发送WM_INITDIALOG消息。

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