WINDOWS窗口座標

不僅是有最大最小關閉按鈕的那個矩形東西被稱爲窗口,

全部控件是窗口。窗口中的子窗口是窗口。



【窗口的組成】

外部邊框。窗口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); //控件的父窗口是對話框



這個比較有用,能夠計算某控件相對位於父窗口客戶區座標系中的座標。
相關文章
相關標籤/搜索