關於ClientToScreen、ScreenToClient、GetClientRect和GetWindowRect四個函數之間的關係

來源:互聯網
上載者:User

 對於這四個函數,想必有部分人還不知道其真正的原理吧.今天我也著實總結下:

GetClientRect和GetWindowsRect兩者之間的關係:

GetClientRect的CRect是相對它的視窗的客戶區的原點而言的,即它的左上方座標總是(0,0),大小總是客戶區的長寬。

GetWindowRect得到的CRect則是相對於螢幕座標而言的,它的左上方座標就是視窗在螢幕上的左上方座標,它的大小就是整個視窗的大小。 

ClientToScreen和ScreenToClient兩者之間的關係:

ClientToScreen,可以把一個CPoint對象或CRect對象的座標從客戶區座標系(以客戶區左上方為原點)變換為螢幕座標系(以螢幕左上方為原點)。 

如:

// 把對話方塊的大小變成客戶區的大小 

void CAboutDlg::OnButton1() 

//1.通話GetClientRect來擷取表單的矩形地區

CRect myRect; 

GetClientRect(&myRect);//取得客戶區的大小 

ClientToScreen(myRect);//轉換為螢幕座標 

MoveWindow(myRect.left, myRect.top, 

myRect.Width(), myRect.Height());//MoveWindow使用的是螢幕座標 

}

ScreenToClient,則可以把一個CPoint對象或CRect對象的座標從螢幕座標系變換為客戶區座標系。 

例如: 

CPoint pos( ::GetMessagePos() ); //::GetMessagePos() 得到發生事件時滑鼠螢幕座標 ScreenToClient(&pos);//把它轉換為客戶區座標以便隨後在繪圖時使用 

 

另外,我們經常需要對對話方塊進行展開.在其展開的過程中總會牽涉到一些控制的擺放問題,這裡我給出我的一點經驗:

首先使用以下語句就可以得到控制項相對於用戶端的位置(這個位置前面已經說得很清楚了)

m_value.GetWindowRect(LPRECT);//擷取表單的矩形地區
ScreenToClient(LPRECT);//從螢幕轉為用戶端

m_value.MoveWindow(LPRECT);

在擷取對話方塊的大小.計算一下控制項距對話方塊的某一邊的長寬度.

每當對話方塊展開的話,在onSize裡面將控制項的相對於對話方塊的大小調解下.(這裡主要注意不變數,一般是控制項的大小不變,只改變位置).

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.