MFC显示对话框的位置,该怎么解决
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取得的矩阵。因为前者包含了非客户区,而后包括了客户区。
------解决方案--------------------
这样也成?![MFC显示对话框的位置,该怎么解决 MFC显示对话框的位置,该怎么解决](/default/index/img?u=aHR0cDovL3d3dy5teWV4Y2VwdGlvbnMubmV0L2ltZy8yMDEzLzA1LzAzLzE2MTYxMjIyNC5naWY=)
------解决方案--------------------
直接使用
BOOL GetWindowRect(
HWND hWnd,
LPRECT lpRect
);
吧,这个获取的是屏幕坐标。
//获取窗口显示的位置
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
);
吧,这个获取的是屏幕坐标。