對於這四個函數,想必有部分人還不知道其真正的原理吧.今天我也著實總結下:
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裡面將控制項的相對於對話方塊的大小調解下.(這裡主要注意不變數,一般是控制項的大小不變,只改變位置).