关于c ++:GetWindowRect坐标不是相对于屏幕的

GetWindowRect coordinates not screen-relative

我正在使用Visual Studio 2008 C ++。我有一个带有控件的MFC对话框。我试图在控件中放置另一个对话框。

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

为什么GetWindowRect()不返回屏幕相对坐标?还有另一种获取方法吗?

我对编程并不陌生,但是对Windows编程,Visual Studio和MFC却不是很陌生,因此我可能会遗漏一些明显的东西。

这是我在OnInitDialog中为父对话框所做的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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\
"
,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包含:

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


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

Windows sends the WM_INITDIALOG message to the dialog box during the Create, CreateIndirect, or DoModal calls, which occur immediately before the dialog box is displayed.

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


正如在其他答案中所写:

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

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

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


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