窗口座標,邏輯座標和視口座標,設備座標的區別

應該說 窗口座標 是相對於 視口座標 而言 邏輯座標 是相對於 設備座標 而言 補充: 窗口座標是基於邏輯座標的. 視口座標是基於設備座標. 上面這兩話是抄自百度百科的,我的理解是: 窗口座標的單位長度與邏輯座標的單位長度相同,也就是說,當你在窗口座標上畫圖時,傳遞給畫圖函數的參數的單位是邏輯單位。但是當windows把圖形輸出到屏幕上時,並不是直接把圖形按照它在窗口座標上的位置輸出到屏幕上的,而是先把它在窗口座標上的值轉換成視口座標上的值(與此同時,也把邏輯座標按照不同的映射模式轉換成設備座標)。下面舉例說明: 由於 一般情況下,窗口原點是與視口原點相同的,(也就是說,位於屏幕上的同一個位置),爲了體會不窗口座標與視口座標的轉換,先用SetwindowtOrg(100,-300)將視口移到(100,-300),這相當於把 邏輯點(100,-300)映射到設備點(0,0) (注意:如果改用SetviewportOrg移動原點,則其原點的移動尺寸與映射模式無關,其300個長度單位等於9釐米)(注:這個設備點也是相對於當前的DC而言,如果當前的DC是整個屏幕,那麼設備點(100,-300)的原點就在屏幕的左上角,如果當前的DC是某個應用程序的客戶區,那麼設備點(100,-300)的原點就是應用程序的客戶區的左上角,) 現在假設當前DC是某個應用程序的客戶區,映射模式爲 MM_LOMETRIC (在這種映射模式下,設備座標以0.1 毫米爲一個長度單位,Y軸的正方向爲向上,也就是說,屏幕上的左上角的Y座標爲0,下面的Y座標均小於0),當使用語句: MoveTo(100,-600); LineTo(100,-800);//Y軸負方向向下,所以用負值 進行畫圖時,它的轉換過程如下: 1)窗口與視口座標轉換,由於窗口座標(100,-300 ),映射爲設備座標(0,0),所 以 窗口(100,-600)映射爲視口(0,-300) 窗口(100,-800)視映射爲視口(0,-500) 2)邏輯與設備座標轉換 由於是 MM_LOMETRIC 映射模式,設備座標的單位長度爲 0.1mm,而在輸出時用的是視口座標,所以視口座標(100,-600)輸出到屏幕上時,該點的位置 距客戶區左邊 0 釐米,距客戶區上邊 3釐米。這就是直線的起點; 再把直線終點的視口座標(100,-800)輸出到距客戶區左邊0釐米,距客戶區上邊 5釐米處。 以上就是全部過程 在不同的映射模式下,一個邏輯單位 對應 不同的 設備單位, 例如:在 MM_TEXT 映射模式下,設備座標是以像素爲單位的, 也就是說,如果你這時要用一個函數畫一條直線,並且傳遞給它的參數大小爲 100,(通常情況下,傳遞給函數的參數通常是視作邏輯座標下的數值,也就是說,這裏的100指的是邏輯座標裏100個單位長度.不過也不一定,用時請看具體情況,這個我也不大清楚),那麼它將會在屏幕上畫一條100像素長的線條, 如果是在 MM_LOMETRIC 映射模式下,設備座標是以0.1 毫米爲一個長度單位的,如果你這時要用一個函數畫一條直線,並且傳遞給它的參數大小爲 100,那麼它將會在屏幕上畫出 0.1毫米 * 100 = 10 釐米 長的直線, 當然,由於各種複雜的原因,畫長的直線可能並不是剛好10 釐米長,但誤差不會很大 至於窗口與視口座標的問題,你可以看這裏 http://baike.baidu.com/view/1522985.htm 補充: 我的理解是這樣的,窗口座標與視口座標是與DC(即設備上下文)相關的,如果 DC是整個屏幕,那麼窗口座標的原點就是屏幕的左上角,如果DC是一個應用程序的窗口的客戶區,那麼窗口座標的原點就是該客戶區的左上角
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章