首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

MFC展示对话框的位置

2012-12-17 
MFC显示对话框的位置//获取窗口显示的位置GetDlgItem(IDC_STATIC_Child)-GetWindowRect(ChildFunctionRec

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 
); 
吧,这个获取的是屏幕坐标。
[其他解释]

引用:
ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值
ClientToScreen(ChildFunctionRect);//再把值转化为屏幕的值
貌似这样就补偿了误差

这样也成?
[其他解释]
引用:
好像不用ScreenToClient(ChildFunctionRect);这句吧
其实这个就是windowrect和clientrect的区别,了解了就知道怎么回事了吧?

GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。 
GetClientRect取得窗口客户区(不包括非客户区)在客户区……


//获取窗口显示的位置
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);//再把值转化为屏幕的值
貌似这样就补偿了误差

热点排行