通过例子来说明这两个函数的具体作用。
创建一个基于Dialog的MFC应用程序工程Dialog,在对话框上添加一个按钮,其ID为IDC_BTN_ESCAPE:
在DialogDlg.cpp中使用语句:
- CRect rectBtn;
- GetDlgItem(IDC_BTN_ESCAPE)->GetWindowRect(&rectBtn);
rectBtn中获取的是以屏幕为坐标轴,按钮在屏幕上的位置。
而使用下面的语句:
- CRect rectBtn;
- GetDlgItem(IDC_BTN_ESCAPE)->GetClientRect(&rectBtn);
rectBtn中获取的是以ID为IDC_BTN_ESCAPE(按钮)的窗口的最左上角的点为坐标原点,按钮的位置。
通过上述分析可知:
GetWindowRect();获取的是以屏幕为坐标轴,此窗口在屏幕上的位置。
GetClientRect();获取的是以其自身的最左上角的点为坐标原点,此窗口的位置。
更为具体的,也可参考下面的文章:
原文地址:vc:GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen作者:好好
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.left和rt.top为该控件在对话框中的位置;
GetDlgItem(IDC_CB)->SetWindowPos(NULL,rt.left,rt.top,0,0,SWP_NOSIZE);// 设置该位置(其实还是在原位置,因为rt.left和rt.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);