程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> GetClientRect()和GetWindowRect(),getwindowrect

GetClientRect()和GetWindowRect(),getwindowrect

編輯:C++入門知識

GetClientRect()和GetWindowRect(),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則會出問題。

 

   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved