設備座標、邏輯座標、物理座標的區別與轉換(更改原文一處錯誤)

http://blog.csdn.net/lzm420241/article/details/7775994

只要區分 設備座標、邏輯座標 就可以了,窗口中的每個點都對應一個設備 
座標和一個邏輯座標。 可相互轉化, 拿窗口來說,設備座標就是窗口可見部分的座標系。 
譬如說你用鼠標在屏幕上的某個位置點一下,他會有一個設備座標,你拉 
動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()所用參數它都認爲是邏輯座標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章