我在Visual 2008 C++工作。我有一个MFC对话框,里面有一个控件。我正在尝试在控件中定位另一个对话框。
第二个对话框上的SetWindowPos()显然使用屏幕坐标,所以我需要获得控件或父对话框的屏幕坐标。MSDN文档说,GetWindowRect()提供了“相对于显示屏幕左上角的屏幕坐标”,但这不是我要得到的。在控件上,它给出相对于父控件的坐标。在父级上,它给出了left=0和top=0。我也尝试过GetWindowPlacement()中的矩形,它也给出了同样的内容。一切都是相对于父母的。
为什么GetWindowRect()不返回屏幕相对坐标?还有别的办法来抓他们吗?
我不是编程新手,而是Windows编程、Visual和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
发布于 2014-10-06 09:38:37
另一份答复中写道:
在窗口移动到其最终位置之前,OnInitDialog被称为。如果稍后调用GetWindowRect,您将看到它返回正确的坐标。
只需将PostMessage与WM_APP+n消息一起使用即可。此消息将在消息泵运行时到达,而消息将在窗口定位并显示在屏幕上时到达。
或者用计时器。这也有同样的效果。
发布于 2014-10-06 23:20:21
在对话框显示之前,框架将调用OnInitDialog
。在这一点上,不知道最终的大小或位置:
Windows在WM_INITDIALOG、CreateIndirect或DoModal调用期间将消息发送到对话框,这些调用发生在对话框显示之前。
对话框的最终大小和位置是窗口定位协商的结果。发送到可用信息的对话框的第一条消息是WM_WINDOWPOSCHANGED
。使用MFC,将通过CWnd::OnWindowPosChanged
处理此消息。可以通过重写OnWindowPosChanged
类中的CDialog
-derived类来实现自定义处理代码。
发布于 2014-10-06 09:23:32
在将窗口移动到其最后位置之前调用OnInitDialog
。如果稍后调用GetWindowRect
,您将看到它返回正确的坐标。
https://stackoverflow.com/questions/26220252
复制