只要區分 設備座標、邏輯座標 就可以了,窗口中的每個點都對應一個設備
座標和一個邏輯座標。 可相互轉化, 拿窗口來說,設備座標就是窗口可見部分的座標系。
譬如說你用鼠標在屏幕上的某個位置點一下,他會有一個設備座標,你拉
動VScroll或HScroll,再在相同的位置點一下,它還是產生那個設備座標,
而這時它的邏輯座標已經變了。
因爲相對於可見部分的窗口來說,他們是同一個點。而相對於Document來說,他們不是同一個點。Understand?
希望我的描述對你理解有點幫助。
在Windows中,文檔座標系稱作邏輯座標系,視圖座標系稱爲設備座標系。
邏輯座標按照座標設置方式(又成爲映射模式)可分爲8種,它們在座標上的特性如下表所示:
表7-1 各種映射模式下的座標轉換方式
映射模式 邏輯單位 x遞增方向
y遞增方向
MM_TEXT 像素 向右
向下
MM_LOMETRIC 0.1mm 向右
向上
MM_HIMETRIC 0.01mm 向右
向上
MM_LOENGLISH 0.01inch 向右
向上
MM_HIENGLISH 0.001inch 向右
向上
MM_TWIPS 1/1440inch 向右
向上
MM_ISOTROPIC 可調整 (x=y) 可選擇
可選擇
MM_ANISOTROPIC 可調整(x!=y) 可選擇
可選擇
我們一般使用的映射模式是MM_TEXT,它也是缺省設置。在該模式下,座標原點在工作區左上角,而x座標值是向右遞增,y座標值是向下遞增,單位值1代表一個像素。
設備座標以像素點爲單位,且x軸座標值向右遞增,y軸座標值向下遞增,但原點(0,0)位置卻不限定在工作區的左上角。依據設備座標的原點和用途,可以將Windows下使用的設備座標系統分爲三種:工作區座標系統,窗口座標系統和屏幕座標系統。
(1)工作區座標系統:
工作區座標系統是最常見的座標系統,它以窗口客戶區左上角爲原點(0,0),主要用於窗口客戶區繪圖輸出以及處理窗口的一些消息。鼠標消息WM_LBUTTONDOWN、WM_MOUSEMOVE傳給框架的消息參數以及CDC一些用於繪圖的成員都是使用工作區座標。
(2)屏幕座標系統:
屏幕座標系統是另一類常用的座標系統,以屏幕左上角爲原點(0,0)。以CreateDC(“DISPLAY” , ...)或GetDC(NULL)取得設備上下文時,該上下文使用的座標系就是屏幕座標系。
一些與窗口的工作區不相關的函數都是以屏幕座標爲單位,例如設置和取得光標位置的函數SetCursorPos()和GetCursorPos();由於光標可以在任何一個窗口之間移動,它不屬於任何一個單一的窗口,因此使用屏幕座標。彈出式菜單使用的也是屏幕座標。另外,CreateWindow、MoveWindow、SetWindowPlacement()等函數用於設置窗口相對於屏幕的位置,使用的也是屏幕座標系統。
(3)窗口座標系統:
窗口座標系統以窗口左上角爲座標原點,它包含了窗口控制菜單、標題欄等內容。一般情況下很少在窗口標題欄上繪圖,因此這種座標系統很少使用。
另外:
視圖中利用的是影射方式 MM_ANISOTROPIC,現在想把鼠標所在的點的座標利用邏輯座標給標出來,利用ScreenToClient()
setwindowExt()
setviewportExt()
setwindowOrg()
setviewportorg() 的區別:
SetViewportExt和SetWindowExt用來確定邏輯座標下和設備座標下的尺寸對應關係
SetWindowExt(int Lwidth, int Lheight)
//window的寬(高)度,參數的單位爲邏輯單位(Logical),如果參數爲負值表示window相應的座標軸與page空間相反。
SetViewportExt(int Pwidth, int Pheight)
//viewport的寬(高)度,參數的單位爲像素(Pixel),如果參數爲負值表示viewport相應的座標軸與device空間相反。
SetWindowOrg(int Lx, int Ly)
//設置邏輯座標的座標原點 此處原文由錯誤
SetViewportOrg(int Px, int Py)
//設置設備座標的座標原點 此處原文由錯誤
所謂設備座標與邏輯座標只是相對的概念。
比如點pt(1000,1000),如果你認爲他是
設備座標,那麼經過下變換,他就變成邏輯
座標:
dc.DPtoLP(&pt);
如果你認爲他是
邏輯座標,那麼經過下變換,他就變成設備座標:
dc.DPtoLP(&pt);
是設備座標還是邏輯座標,與DC的影射模式(MapMode)
無關,任何影射模式都有設備座標與邏輯座標。其中,設備座標
是統一的的,即都是指設備象素座標。
CRect並無設備座標或邏輯座標之分,關鍵在於你怎麼認爲它和怎麼用它。
一般dc所接受的參數是邏輯座標,窗口函數都是接受設備座標。
所以不管是否用了DPtoLP或LPtoDP,Rectangle()所用參數它都認爲是邏輯座標。