新建一个对话框,添加一个按钮button1,为其添加响应函数:void CDlgDlg::OnButton1()
{
CString str;
CRect rt;
GetWindowRect(rt);
str.Format("%d\n%d\n%d\n%d",rt.left,rt.top,rt.right,rt.bottom);
MessageBox(str);
ScreenToClient(rt);
CString str2;
str2.Format("%d\n%d\n%d\n%d",rt.left,rt.top,rt.right,rt.bottom);
MessageBox(str2);经过ScreenToClient(rt);转换后rt.left,rt.top的值居然为一个负数,这是为什么?
msdn的解释为:
说明:
将显示器上给定点或矩形的屏幕坐标转换为客户坐标。
ScreenToClient成员函数将lpPoint或lpRect给定的屏幕坐标替换为客户坐标。新的坐标是相对于CWnd客户区的左上角的。想了半天实在是找不出左上角点坐标为负数的解释?另外还有一个问题:把以上代码放到OnInitDialog()函数中执行的话,rt.left,rt.top的值为0,0,合理的解释是对话框在OnInitDialog()函数执行的时候还没有创建,但是
rt1.Width(),rt1.Height()执行这个话,却又能够得到正确的值,这也就推翻了刚才的那个合理的解释,因为要是对话框在OnInitDialog()函数执行的时候还没有创建,那么对话框的高和宽,即:rt1.Width(),rt1.Height()这两个值从何而来?
一句话:rt.left,rt.top的值为什么0,0,?
{
CString str;
CRect rt;
GetWindowRect(rt);
str.Format("%d\n%d\n%d\n%d",rt.left,rt.top,rt.right,rt.bottom);
MessageBox(str);
ScreenToClient(rt);
CString str2;
str2.Format("%d\n%d\n%d\n%d",rt.left,rt.top,rt.right,rt.bottom);
MessageBox(str2);经过ScreenToClient(rt);转换后rt.left,rt.top的值居然为一个负数,这是为什么?
msdn的解释为:
说明:
将显示器上给定点或矩形的屏幕坐标转换为客户坐标。
ScreenToClient成员函数将lpPoint或lpRect给定的屏幕坐标替换为客户坐标。新的坐标是相对于CWnd客户区的左上角的。想了半天实在是找不出左上角点坐标为负数的解释?另外还有一个问题:把以上代码放到OnInitDialog()函数中执行的话,rt.left,rt.top的值为0,0,合理的解释是对话框在OnInitDialog()函数执行的时候还没有创建,但是
rt1.Width(),rt1.Height()执行这个话,却又能够得到正确的值,这也就推翻了刚才的那个合理的解释,因为要是对话框在OnInitDialog()函数执行的时候还没有创建,那么对话框的高和宽,即:rt1.Width(),rt1.Height()这两个值从何而来?
一句话:rt.left,rt.top的值为什么0,0,?
2. 你说那个rt的left和top是0,ScreenToClient之前的还是之后的
负数有时候是有的边框的问题,0,0是正常的,自己对自己当然是0,0
也就是你的Rect其实是大于你的client的区域的。
2、rt的left和top是0,ScreenToClient之前的还是之后的?
ScreenToClient(rt);//将客户区坐标做为屏幕区再转客户区,L,T就可能为负,除非你将客户区移到屏幕左上角
你应该用:
ClientToScreen(rt);//这样rt就是客户区相对于屏幕的坐标了