计算控件位置的函数

liviatt 2008-12-09 09:14:33
((CStatic*)GetDlgItem(IDC_STATIC))->GetClientRect(&rs);

((CStatic*)GetDlgItem(IDC_STATIC))->GetWindowRect(&rs);
ScreenToClient(&rs);
算的结果为什么不一样呢
都怎么算的?
...全文
95 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
liviatt 2008-12-09
  • 打赏
  • 举报
回复
((CStatic*)GetDlgItem(IDC_STATIC))->GetWindowRect(&rs);
ScreenToClient(&rs);
这个得到的才是控件在父窗口的位置。

((CStatic*)GetDlgItem(IDC_STATIC))->GetClientRect(&rs);

((CStatic*)GetDlgItem(IDC_STATIC))->GetWindowRect(&rs);
((CStatic*)GetDlgItem(IDC_STATIC))->ScreenToClient(&rs);
是一样的效果,但是没什么用。

结贴~
amper736 2008-12-09
  • 打赏
  • 举报
回复
不一样啊,,GetClientRect(&rs)这个是你得到的是IDC_STATIC的距形区域,top 和left 是0,经过ScreenToClient(&rs)(也就是减去窗口往上移动的距离)后就变成负数了,而GetWindowRect(&rs)这个得到的是IDC_STATIC控件从窗口右上角开始计算,所在距形区域,,如果还不明白,你在那里设置一个断点,得到的值,再看这个啊
Tinary3v0 2008-12-09
  • 打赏
  • 举报
回复
3楼说的对,ScreenToClient的使用跟调用它的窗口有关系
你要是这样((CStatic*)GetDlgItem(IDC_STATIC))->ScreenToClient(&rs);应该就是相同的值了。
你这样ScreenToClient(&rs);默认的是对话框调用,返回的应该是Static相对于对话框窗口的位置了。
filec75 2008-12-09
  • 打赏
  • 举报
回复
ding
liviatt 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 amper736 的回复:]
再调用ScreenToClient(&rs);这个函数转换时,整个窗口往右上角移,GetWindowRect(&rs)会得到控件在窗口的坐标,GetClientRect(&rs)减去往右上角移动相应的距离
[/Quote]
按你这么说
((CStatic*)GetDlgItem(IDC_STATIC))->GetClientRect(&rs);

((CStatic*)GetDlgItem(IDC_STATIC))->GetWindowRect(&rs);
ScreenToClient(&rs);
应该是一样的了
zskof 2008-12-09
  • 打赏
  • 举报
回复
ScreenToClient(&rs); 在哪里调的,是不是MFC的CDialog中,那么ScreenToClient的主体是CDialog吧,是否应该是
((CStatic*)GetDlgItem(IDC_STATIC))->ScreenToClient(rs.TopLeft());
((CStatic*)GetDlgItem(IDC_STATIC))->ScreenToClient(rs.BottomRight());
amper736 2008-12-09
  • 打赏
  • 举报
回复
再调用ScreenToClient(&rs);这个函数转换时,整个窗口往右上角移,GetWindowRect(&rs)会得到控件在窗口的坐标,GetClientRect(&rs)减去往右上角移动相应的距离
amper736 2008-12-09
  • 打赏
  • 举报
回复
GetWindowRect 返回坐标相当于整个屏幕

GetClientRect 返回控件自身大小

15,979

社区成员

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

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