MFC显示对话框的位置
//获取窗口显示的位置
GetDlgItem(IDC_STATIC_Child)->GetWindowRect(ChildFunctionRect);
ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值
//在指定位置显示对话框
CDevelopInformationDlg *pInforDlg=new CDevelopInformationDlg;
pInforDlg->Create(IDD_DevelopInformationDlg);
pInforDlg->MoveWindow(ChildFunctionRect);
pInforDlg->ShowWindow(SW_SHOW);
其中的IDC_STATIC_Child是MFC中一个组框的ID,我的目的是在组框的位置处,显示一个一样大小的对话框IDD_DevelopInformationDlg,
但是结果显示出来,大小是对了,只是位置却偏左上方了
[最优解释]
好像不用ScreenToClient(ChildFunctionRect);这句吧
其实这个就是windowrect和clientrect的区别,了解了就知道怎么回事了吧?
GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。
GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。
ClientToScreen把客户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标.
ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标.我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系。显然,GetWindowRect取得的矩阵不小于GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。
[其他解释]
直接使用
BOOL GetWindowRect(
HWND hWnd,
LPRECT lpRect
);
吧,这个获取的是屏幕坐标。
[其他解释]
这样也成?
[其他解释]
//获取窗口显示的位置
GetDlgItem(IDC_STATIC_Child)->GetClientRect(ChildFunctionRect);
//ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值
//在指定位置显示对话框
CDevelopInformationDlg *pInforDlg=new CDevelopInformationDlg;
pInforDlg->Create(IDD_DevelopInformationDlg);
pInforDlg->MoveWindow(ChildFunctionRect);
pInforDlg->ShowWindow(SW_SHOW);
这样子还是往左上角偏移。。。。难道要靠加减坐标啦?
[其他解释]
我发现这样就解决了。。。。
GetDlgItem(IDC_STATIC_Child)->GetClientRect(ChildFunctionRect);
ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值
ClientToScreen(ChildFunctionRect);//再把值转化为屏幕的值
//在指定位置显示对话框
CDevelopInformationDlg *pInforDlg=new CDevelopInformationDlg;
pInforDlg->Create(IDD_DevelopInformationDlg);
pInforDlg->MoveWindow(ChildFunctionRect);
pInforDlg->ShowWindow(SW_SHOW);
这样显示完全正确。。。。。。。。。。。。。。。。。。
[其他解释]
ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值
ClientToScreen(ChildFunctionRect);//再把值转化为屏幕的值
貌似这样就补偿了误差