不僅是有最大最小關閉按鈕的那個矩形東西被稱爲窗口,
全部控件是窗口。窗口中的子窗口是窗口。
【窗口的組成】
外部邊框。窗口Border屬性爲 Thin, Resizing時,有3個像素寬的邊框。
系統區:窗口上部藍色部分,有最大最小關閉按鈕的那一個部分。
客戶區:除去外部邊框和系統區的部分。系統區有統一的機制處理,客戶區
是由客戶程序員定義外觀和行爲的部分。
【座標系】
屏幕座標系:定義屏幕左上角爲(0,0)原點
窗口安放在二維平面上,通常爲電腦顯示器所在的視覺平面上。
座標單位爲「像素」。假設顯示器分辨率爲(800*600),那麼
屏幕右下角座標爲(800,600)。
客戶區座標系:以窗口客戶區的左上角爲(0,0)原點。向右爲X軸正方向。
向下爲Y軸正方向。
【經常使用函數】
GetWindowRect
取得窗口(包括邊框和系統區)位於屏幕座標系中的位置信息。
若是「窗口」是按鈕等控件,就是控件的總體(包括邊框)位於屏幕座標系中位置。
GetClientRect
得到窗口位於客戶座標系中的位置信息。
CRect rc;
對話框->GetClientRect(&rc); //得到對話框客戶區尺寸信息。
返回的rc永遠是(0,0,width,height),其中width是客戶區寬度(單位像素)
height是客戶區高度。
CRect rc;
控件->GetClientRect(&rc); //得到控件客戶區尺寸信息。
返回的rc永遠是(0,0,width,height),其中width是控件寬度(單位像素)
height是控件的高度。
ClientToScreen
將客戶區座標系翻譯成屏幕座標系。
描述慣例 CRect=(左,頂,右,底)
例子1:
CRect rect;
控件->GetClientRect(&rect); //rect = (0,0,20,10)
CRect rect2 = rect;
控件->ClientToScreen(&rect2); //rect2 = (a,b,a+20,b+10)
其中a,b爲控件某點(左上角的那個點)在屏幕座標系的座標。
例子2:
CRect rect;
對話框->GetClientRect(&rect); //rect = (0,0,20,10)
CRect rect2 = rect;
對話框->ClientToScreen(&rect2); //rect2 = (a,b,a+20,b+10)
其中a,b爲對話框某點(左上角的那個點)在屏幕座標系的座標。
ScreenToClient
將屏幕座標系翻譯成客戶區座標系。
例子3:
CRect rect;
控件->GetWindowRect(&rect); //rect = (l,t,r,b)
CRect rect2 = rect;
控件->ScreenToClient(&rect2); //rect2 = (0,0,r-l,b-t)
例子4:
CRect rect;
對話框->GetWindowRect(&rect); //rect = (l,t,r,b)
CRect rect2 = rect;
對話框->ScreenToClient(&rect2); //rect2 =
(-e,-(e+h),(r-l)-e,(b-t)-(e+h))
其中:e表明窗口的邊框寬度,通常是3個像素。
h表明系統區的title-bar的高度,通常是26個像素。
負數是從何而來呢?GetWindowRect是取整個窗口全體(包括系統區和邊框)
所以變換到客戶區座標系時,對話框左邊位於客戶區座標系原點右側(負方向)
所以左邊的座標就是-3。
(矩形的幾何面積沒有變化,變化的是位置值。座標變換屬於剛體運動變換)
例子5:
CRect rect;
控件->GetWindowRect(&rect);
CRect rect2 = rect;
對話框->ScreenToClient(&rect2); //控件的父窗口是對話框
這個比較有用,能夠計算某控件相對位於父窗口客戶區座標系中的座標。