日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GetClientRect()和GetWindowRect()

發(fā)布時間:2025/3/12 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GetClientRect()和GetWindowRect() 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

GetClientRect()?? 是得到客戶區(qū)坐標系下客戶區(qū)的RECT

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

?

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

  根據(jù)不同參數(shù):

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

    分別獲得屏幕的寬和高。

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

    分別獲得虛擬屏的寬和高,如電腦接了雙屏,就用這個來獲取雙屏的分辨率之和。

?

驗證過程:

?創(chuàng)建一個窗口,添加按鈕,添加以下代碼

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獲得的是客戶區(qū)相對于客戶區(qū)坐標系的位置,其left和top都為0,在未將客戶區(qū)坐標轉(zhuǎn)換為屏幕坐標(ClientToScreen)前MoveWindow會將窗口移動到屏幕的原點。且窗口變小,因為把窗口塞進了原客戶區(qū)的RECT里了。

?

如果在中間加一個ClientToScreen過程,則窗口不會移動到屏幕左上角,但是窗口還是會變小。

CRect rc;GetClientRect(&rc);int e = rc.left; //0int f = rc.top; //0int g = rc.Width(); //560int 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 // 因為客戶區(qū)大小要小于窗口大小,MoveWindow將窗口移動到客戶區(qū)寬、客戶區(qū)長的矩形內(nèi),所以窗口會變小MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

?說明ClientToScreen只是改變參照坐標,唯一改變的是RECT的left和top的值。

?

但是先GetWindowRect后再ClientToScreen后,發(fā)現(xiàn)窗口RECT的left和top都加上了客戶區(qū)的left和top,導致按下按鈕后窗口往下移了一個客戶區(qū)的高度,往右移了一個客戶區(qū)的寬度。

CRect rc;GetClientRect(&rc);int e = rc.left; //0int f = rc.top; //0int g = rc.Width(); //560int h = rc.Height();//350 GetWindowRect(&rc);int i = rc.left; //357int j = rc.top; //271int k = rc.Width(); //566int m = rc.Height();//378 ClientToScreen(&rc);int x = rc.left; //717 = 360(客戶區(qū)相對屏幕的left位置)+ 357(窗口相對屏幕的left位置)int y = rc.top; //567 = 296(客戶區(qū)相對屏幕的top 位置)+ 271(窗口相對屏幕的top 位置) int z = rc.Width(); //566int u = rc.Height(); //378 MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

即把一個窗口的RECT做ClientToScreen操作,窗口RECT的left會加上客戶區(qū)的left,top會加上客戶區(qū)的top,這是

為什么?

再試一下,把一個已經(jīng)以屏幕坐標系為參照的RECT再做ClientToScreen操作,發(fā)現(xiàn)窗口的位置也會加上一個客戶區(qū)的left和top

CRect rc;GetClientRect(&rc);int i = rc.left; //0int j = rc.top; //0int k = rc.Width(); //560int 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 * 360int q = rc.top; //592 = 2 * 296int w = rc.Width(); //560 int e = rc.Height();//350 MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

所以在ClientToScreen(RECT)前需要確定參數(shù)RECT必須是以客戶區(qū)為參照的RECT,如果是以屏幕為參照的RECT則會出問題

ClientToScreen的功能是左邊加上相對于Windows的Left值,頂部加上相對于Windows的Top值(待修改驗證)

再來看看ScreenToClient()函數(shù)

CRect rc;GetWindowRect(&rc);int i = rc.left; //357int j = rc.top; //271int k = rc.Width(); //566int m = rc.Height();//378 ScreenToClient(&rc);int n = rc.left; //-3 // 客戶區(qū)原點和屏幕原點重合,窗口原點移動到了第二象限。int q = rc.top; //-25int w = rc.Width(); //566 int e = rc.Height();//378 // 窗口從屏幕參照變成了客戶區(qū)參照,將客戶區(qū)原點移動到了屏幕原點,窗口原點則變成負數(shù)。MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());

?

總結

以上是生活随笔為你收集整理的GetClientRect()和GetWindowRect()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。