GetClientRect()和GetWindowRect()

GetClientRect()   是得到客户区坐标系下客户区的RECT

GetWindowRect()是得到屏幕坐标系下整个窗口的RECT

GetSystemMetrics()是获得屏幕分辨率大小

  根据不同参数:

    int width = GetSystemMetrics ( SM_CXSCREEN ); 
    int height= GetSystemMetrics ( SM_CYSCREEN );

    分别获得屏幕的宽和高。

    int width = GetSystemMetrics ( SM_CXVIRTUALSCREEN ); 
    int height= GetSystemMetrics ( SM_CXVIRTUALSCREEN);

    分别获得虚拟屏的宽和高,如电脑接了双屏,就用这个来获取双屏的分辨率之和。

验证过程:

创建一个窗口,添加按钮,添加以下代码

    CRect rc;
    GetWindowRect(&rc);
    MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

点击按钮时,窗口不会变化。因为GetWindowRect是相对于屏幕的,MoveWindow后将窗口移动到了原来的位置,即位置没变。

    CRect rc;
    GetWindowRect(&rc);
    MoveWindow(rc.left-20, rc.top,rc.Width(), rc.Height());

点击按钮时,窗口向左移动
 说明GetWindowRect获取的是屏幕坐标系下窗口的大小。

    CRect rc;
    GetClientRect(&rc);
    MoveWindow(rc.left, rc.top, rc.Width(), rc.Height());

点击按钮时,窗口移动到屏幕左上角,因为GetClientRect获得的是客户区相对于客户区坐标系的位置,其left和top都为0,在未将客户区坐标转换为屏幕坐标(ClientToScreen)前MoveWindow会将窗口移动到屏幕的原点。且窗口变小,因为把窗口塞进了原客户区的RECT里了。

如果在中间加一个ClientToScreen过程,则窗口不会移动到屏幕左上角,但是窗口还是会变小。

    CRect rc;
    GetClientRect(&rc);

    int e = rc.left;    //0
    int f = rc.top;     //0
    int g = rc.Width(); //560
    int h = rc.Height();//50

    ClientToScreen(&rc);

    int x = rc.left;    //360
    int y = rc.top;     //296
    int z = rc.Width(); //560
    int u = rc.Height();//350  

    // 因为客户区大小要小于窗口大小,MoveWindow将窗口移动到客户区宽、客户区长的矩形内,所以窗口会变小
    MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

说明ClientToScreen只是改变参照坐标,唯一改变的是RECT的left和top的值。

但是先GetWindowRect后再ClientToScreen后,发现窗口RECT的left和top都加上了客户区的left和top,导致按下按钮后窗口往下移了一个客户区的高度,往右移了一个客户区的宽度。

    CRect rc;
    GetClientRect(&rc);

    int e = rc.left;    //0
    int f = rc.top;     //0
    int g = rc.Width(); //560
    int h = rc.Height();//350

    GetWindowRect(&rc);
    int i = rc.left;    //357
    int j = rc.top;     //271
    int k = rc.Width(); //566
    int m = rc.Height();//378

    ClientToScreen(&rc);

    int x = rc.left;      //717 = 360(客户区相对屏幕的left位置)+ 357(窗口相对屏幕的left位置)
    int y = rc.top;       //567 = 296(客户区相对屏幕的top 位置)+ 271(窗口相对屏幕的top 位置)
    int z = rc.Width();   //566
    int u = rc.Height();  //378

    MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

即把一个窗口的RECT做ClientToScreen操作,窗口RECT的left会加上客户区的left,top会加上客户区的top,这是

为什么?

再试一下,把一个已经以屏幕坐标系为参照的RECT再做ClientToScreen操作,发现窗口的位置也会加上一个客户区的left和top

    CRect rc;
    GetClientRect(&rc);
    int i = rc.left;    //0
    int j = rc.top;     //0
    int k = rc.Width(); //560
    int m = rc.Height();//350

    ClientToScreen(&rc);

    int x = rc.left;   //360
    int y = rc.top;    //296
    int z = rc.Width();//560
    int u = rc.Height();//350 

    ClientToScreen(&rc);
    int n = rc.left;    //720 = 2 * 360
    int q = rc.top;     //592 = 2 * 296
    int w = rc.Width(); //560
    int e = rc.Height();//350  

    MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

所以在ClientToScreen(RECT)前需要确定参数RECT必须是以客户区为参照的RECT,如果是以屏幕为参照的RECT则会出问题。

  

时间: 2024-08-24 06:39:25

GetClientRect()和GetWindowRect()的相关文章

VC API常用函数简单例子大全[转]

第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCSTR lpWindowName); 第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时填两个参数的,也就是说,你只要知道窗口的类名或窗口的标题就可以了,没有的那个就用NULL代替. 比如现在有一个窗口名为"无标题.txt - 记事本"的记事本程序.那么我就可以用上面的函数获得这个

WIN32 汇编 工具栏的使用

说起工具栏我们都不会陌生为了方便起见,首先看一下图:标示的地方就是工具栏,好像是一个一个的位图文件组成的一样,其实那就是位图组成的,只不过是一组连续在一起的位图(而且是windows自己定义好的,我们只管拿来使用就行了). 对于工具栏的实现我大概分为如下几步: 资源文件 菜单 IDR_MENU1 图标 IDI_ICON1 字符串表 STRINGTABLE     程序源代码 改变工具栏大小     _Resize 消息处理过程 _ProcWinMain 窗口模板 主函数 _WinMain 下面来

GetWindowRect与GetClientRect 的区别[转]

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

GetWindowRect和GetClientRect的区别详解

一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClientRect这两个函数,是获取逻辑坐标系中窗口或控件(其实也是窗口)大小和坐标的常用函数了,有什么不一样的? 先说说什么叫逻辑坐标?讲到逻辑坐标,它相对的一个概念是设备坐标,是为了屏蔽掉不同设备属性差别而设置的抽象坐标系,说白了,就是独立于设备坐标的统一接口,程序员不需要去在具体的设备上进行绘图操作,而只需要在虚拟的环境下进行绘图,就是CDC. 然后由设备驱动去负责虚拟坐标到实际设备坐标之间的转换.通常逻辑

[00012]-[2015-08-27]-[00]-[Windows 程序设计 ---GetWindowDC GetWindowRect GetClientDC(GetDC) GetClientRect]

::GetWindowDC(m_hWnd); // 表示GetWindowDC()是一个全局函数,作用域大 GetWindowDC() 获得的设备环境覆盖了整个窗口(包括非客户区),例如标题栏.菜单.滚动条,以及边框 GetWindowRect() rect表示应用程序窗口在屏幕中的位置rigth left top bottom GetDC() 获取的是应用程序中客户区的环境设备 GetClientRect() rect表示应用程序客户区的rect. left right top bottom

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

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

VC:GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen

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

GetWindowRect和GetClientRect比较学习

一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClientRect这两个函数,是获取逻辑坐标系中窗口或控件(其实也是窗口)大小和坐标的常用函数了,有什么不一样的? 先说说什么叫逻辑坐标?讲到逻辑坐标,它相对的一个概念是设备坐标,是为了屏蔽掉不同设备属性差别而设置的抽象坐标系,说白了,就是独立于设备坐标的统一接口,程序员不需要去在具体的设备上进行绘图操作,而只需要在虚拟的环境下进行绘图,就是CDC. 然后由设备驱动去负责虚拟坐标到实际设备坐标之间的转换.通常逻辑

GetClientRect

这个函数好像就是对应于视口的,获取视口的宽高 #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("坐标") ;