GetWindowRect()和GetClientRect() 及ScreenToClient

 

GetWindowRect()和GetClientRect()


通过例子来说明这两个函数的具体作用。

创建一个基于Dialog的MFC应用程序工程Dialog,在对话框上添加一个按钮,其ID为IDC_BTN_ESCAPE:

在DialogDlg.cpp中使用语句:

[cpp]  view plain copy
  1. CRect rectBtn;  
  2. GetDlgItem(IDC_BTN_ESCAPE)->GetWindowRect(&rectBtn);  

rectBtn中获取的是以屏幕为坐标轴,按钮在屏幕上的位置。

而使用下面的语句:

[cpp]  view plain copy
  1. CRect rectBtn;  
  2. GetDlgItem(IDC_BTN_ESCAPE)->GetClientRect(&rectBtn);  

rectBtn中获取的是以ID为IDC_BTN_ESCAPE(按钮)的窗口的最左上角的点为坐标原点,按钮的位置。

通过上述分析可知:

GetWindowRect();获取的是以屏幕为坐标轴,此窗口在屏幕上的位置。

GetClientRect();获取的是以其自身的最左上角的点为坐标原点,此窗口的位置。



更为具体的,也可参考下面的文章:


原文地址:vc:GetWindowRectGetClientRectScreenToClientClientToScreen作者:好好

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

GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。  
GetClientRect返回的RECT结构上左为零右下分别对应客户区的宽度和高度;

ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标
我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系。
显然,GetWindowRect取得的矩阵不小于GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。   

GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,left,top是窗口的左上角的坐标,相对窗口客户区左上角。   

GetClientRect取得的矩阵ClientToScreen后,矩阵的大小也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT

---------------------------

例:

获取某控件相对于对话框的位置:

CRect rt;
GetDlgItem(IDC_CB)->GetWindowRect(rt);   //取得在屏幕中的位置
ScreenToClient(rt);          //转换到在对话框中的位置
rt.leftrt.top为该控件在对话框中的位置;
GetDlgItem(IDC_CB)->SetWindowPos(NULL,rt.left,rt.top,0,0,SWP_NOSIZE);// 设置该位置(其实还是在原位置,因为rt.leftrt.top本来就是控件在对话框中的位置,如果要调整控件的位置,修改第二和第三个参数即可

from:http://bbs.xml.org.cn/blog/more.asp?name=oceanblue&id=44420

窗口的左上角坐标o(left,top)右下角坐标o(rightk,bottom)

width = right - left;

hight = bottom - top

CRET wr,cr;

    pFrame->GetWindowRect(&wr);//pFrame是一个窗口的指针
   pFrame->GetClientRect(&cr)

其中距形大小  wr(包括客户区和非客户区)>cr(仅包括客户区)

CDialog也遵循以上规律(CDialog也是窗口)

 

也可参考王璇编的程序:

CRect rectL;
CRect RawRect;

GetDlgItem(IDC_PIC1)->GetWindowRect(&rectL);//获取PIC1控件相对于屏幕的位置
ScreenToClient(rectL);//转化为对话框上的相对位置

if(hDIBBK1 )//画在1,1位置,当第一幅图片载入后。
GetDlgItem(IDC_PIC1)->GetClientRect(RawRect);
pDC=GetDlgItem(IDC_PIC1)->GetDC();  //使得(0,0)在图片框的左顶点

cDib.PaintDIBTrue(pDC>GetSafeHdc(),CRect(0,0,rectL.Width(),rectL.Height()),hDIBBK1,CRect(0,0,m_bk_first_width,m_bk_first_height),                SRCCOPY);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值