MFC显示对话框的位置

CodeInfo_ 2012-12-02 11:19:16
//获取窗口显示的位置
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,
但是结果显示出来,大小是对了,只是位置却偏左上方了
...全文
412 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwq850110 2013-04-26
  • 打赏
  • 举报
回复
//获取窗口显示的位置 GetDlgItem(IDC_STATIC_Child)->GetWindowRect(ChildFunctionRect); ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值 你要显示的位置 本来就是相对于 屏幕 的吧, 那就不用再调用ScreenToClient去转了 后面你 ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值 ClientToScreen(ChildFunctionRect);//再把值转化为屏幕的值 这个操作只是 负负得正 的关系 , 相当于两个函数都没有调用。
MoreWindows 2012-12-03
  • 打赏
  • 举报
回复
直接使用 BOOL GetWindowRect( HWND hWnd, LPRECT lpRect ); 吧,这个获取的是屏幕坐标。
sg_knight 2012-12-03
  • 打赏
  • 举报
回复
引用 4 楼 a8082649 的回复:
ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值 ClientToScreen(ChildFunctionRect);//再把值转化为屏幕的值 貌似这样就补偿了误差
这样也成?
CodeInfo_ 2012-12-03
  • 打赏
  • 举报
回复
ScreenToClient(ChildFunctionRect);//把屏幕的值转成实际的值 ClientToScreen(ChildFunctionRect);//再把值转化为屏幕的值 貌似这样就补偿了误差
CodeInfo_ 2012-12-03
  • 打赏
  • 举报
回复
我发现这样就解决了。。。。 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); 这样显示完全正确。。。。。。。。。。。。。。。。。。
CodeInfo_ 2012-12-03
  • 打赏
  • 举报
回复
引用 1 楼 saliors 的回复:
好像不用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); 这样子还是往左上角偏移。。。。难道要靠加减坐标啦?
saliors 2012-12-02
  • 打赏
  • 举报
回复
好像不用ScreenToClient(ChildFunctionRect);这句吧 其实这个就是windowrect和clientrect的区别,了解了就知道怎么回事了吧? GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。 GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。   ClientToScreen把客户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标. ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标.我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系。显然,GetWindowRect取得的矩阵不小于GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。   

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧