zoukankan      html  css  js  c++  java
  • 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则会出问题

    ClientToScreen的功能是左边加上相对于Windows的Left值,顶部加上相对于Windows的Top值(待修改验证)

    再来看看ScreenToClient()函数

        CRect rc;
        GetWindowRect(&rc);
        int i = rc.left;    //357
        int j = rc.top;     //271
        int k = rc.Width(); //566
        int m = rc.Height();//378
    
        ScreenToClient(&rc);
    int n = rc.left; //-3 // 客户区原点和屏幕原点重合,窗口原点移动到了第二象限。 int q = rc.top; //-25 int w = rc.Width(); //566 int e = rc.Height();//378 // 窗口从屏幕参照变成了客户区参照,将客户区原点移动到了屏幕原点,窗口原点则变成负数。 MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

       

  • 相关阅读:
    图解隐马尔科夫模型【会其意】
    基于mysql对mybatis中的foreach进行深入研究
    JS-安全检测JavaScript基本数据类型和内置对象的方法
    Java-生成指定长度验证码的一种简单思路
    jQuery-表单流程导航
    JS-获取URL请求参数
    AngularJS-Uncaught Error: [$injector:modulerr]
    AngularJS-系统代码的配置和翻译
    JS-改变页面的颜色之变化核心-获取六位的随机数
    JS-为金额添加千分位逗号分割符
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4175561.html
Copyright © 2011-2022 走看看