WINDOWS視窗座標

2021-07-27 13:08:07 字數 2182 閱讀 8966

不只是有最大最小關閉按鈕的那個矩形東西被稱為視窗,

所有控制項是視窗。視窗中的子視窗是視窗。

【視窗的組成】

外部邊框。視窗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); //控制項的父視窗是對話方塊

這個比較有用,可以計算某控制項相對位於父視窗客戶區座標系中的座標。

windows視窗座標轉換

知道一點在windows視窗中的座標,怎麼獲取這點對應的螢幕座標,一種做法是windows視窗在螢幕中的座標,加上邊框的大小再加上此點的座標,但這樣處理太複雜了,有一種更簡單的方式是呼叫win32函式 mapwindowpoints。大概用法如下 point posscreen posscreen....

MFC 螢幕座標 視窗座標 邏輯座標 物理座標

int nwidth getsystemmetrics sm cxscreen 螢幕寬度 int nheight getsystemmetrics sm cyscreen 螢幕高度 int cx getsystemmetrics sm cxfullscreen int cy getsystemmet...

Windows座標系統

對映方法 邏輯單位 x和y軸方向 mm text 預設方式 畫素x右,y下 mm lometric 0.1mm x右,y上 mm himetric 0.01mm x右,y上 mm loenglish 0.01英吋 x右,y上 mm hienglish 0.001英吋 x右,y上 mm twips 1...