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本来就是控件在对话框中的位置,如果要调整控件的位置,修改第二和第三个参数即可

窗口的左上角坐标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也是窗口)

【原网址】:http://bbs.xml.org.cn/blog/more.asp?name=oceanblue&id=44420

VC:GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen

时间: 2024-08-29 17:37:06

VC:GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen的相关文章

GetWindowRect() GetClientRect() ScreenToClient() MoveWindow()

CWnd.GetWindowRect 参照坐标系:屏幕坐标系,原点为屏幕左上角(0,0)的位置 功能:取得调用窗口CWnd在屏幕坐标系下的RECT坐标 CWnd.GetClientRect 参照坐标系:CWnd窗口的客户区坐标系,原点为客户区左上角(0,0)的位置 功能:取得窗口在自己的客户区(不包括非客户区)坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置 CWnd.ScreenToClient() 参照坐标系:CWnd窗口的客户区坐标系,原点为客户区左上角(0,0)的位置

GetWindowRect与GetClientRect 的区别[转]

GetWindowRect 函数功能:该函数返回指定窗口的边框矩形的尺寸.该尺寸以相对于屏幕坐标左上角的屏幕坐标给出. 函数原型:BOOL GetWindowRect(HWND hWnd,LPRECTlpRect): 在Visual Studio 2005中,函数原型为void GetWindowRect(LPRECT lpRect) const; 是属于CWnd类的函数. 参数: hWnd:窗口句柄. lpRect:指向一个RECT结构的指针,该结构接收窗口的左上角和右下角的屏幕坐标. 返回值

DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen

设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标.通常将屏幕上的设备坐标称为屏幕坐标.设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角. 逻辑坐标(Logical Coordinate)是系统用作记录的坐标.在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴

vc++经典技巧总结

1."属性页的添加: 创建对话框的类,该类要从CpropertyPage继承:然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch:最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);"//使选项卡的按钮在下面"if(m_tabsheet.m_hWnd)&q

积累的VC编程小技巧之工具条和状态条

1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上). 其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类:也可以选择工程的根,然后点击右键,选择新的类:或者CTL+W,选择增加类/新的类 --- 然后在class type里选择Generic Class,在Name栏里输入新类的名

VC下加载多种格式图片的方法总结IPicture, CxImage, CImage(AtlImage), CPictureEx

尽管VC有提供相应的API和类来操作bmp位图.图标和(增强)元文件,但却不支持jpg.gif和png等格式的图片,而这几种格式却是常常要用到的.这里我给大家介绍两种办法来操作这些格式的图片. 1.用API OleLoadPicture来加载JPG.GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明) OleLoadPicture 函数实际上创建了一个IPicture类型的COM接口对象,然后我们可以通过这个COM接口来操作图片(实际上你也可以用API OleCrea

【VC】Dialog 窗体随意切割子窗体。

用 Dialog 对话框来实现窗体的随意切割. 在资源中加入  Dialog 选择  IDD_FORMVIEW 资源..分别新建FormViewOne,FormViewTwo FormViewThree 类,分别继承基类 CFormView. class CMyFormViewOne : public CFormView { DECLARE_DYNCREATE(CMyFormViewOne) protected: CMyFormViewOne(); // 动态创建所使用的受保护的构造函数 vir

C++ VC实现对话框窗口任意分割

最近写MFC的程序,想在对话框里实现窗口的任意分割.现在网络资料一大抄,找个东西实在麻烦.总算这个很简单,很快就搞定了,写下来做个笔记.    个人认为简单问题最好就是直接贴源代码,一看就明白,说来说去反而弄不清楚,那我就少废话了,自己看吧,注释很清楚. 先来张图片 1. 新建一个MFC对话框程序MySplitterDlg. 再插入两个Dialog资源 ,这里一定要选择IDD_FORMVIEW类别的对话框,分别新建类CMyFormView0 和CMyFormView1,基类别选CDialog,一

【VC】Dialog 窗口任意分割子窗口。

用 Dialog 对话框来实现窗口的任意分割. 在资源中添加  Dialog 选择  IDD_FORMVIEW 资源..分别新建FormViewOne,FormViewTwo FormViewThree 类,分别继承基类 CFormView. class CMyFormViewOne : public CFormView { DECLARE_DYNCREATE(CMyFormViewOne) protected: CMyFormViewOne(); // 动态创建所使用的受保护的构造函数 vir