標籤:style blog http color ar 使用 sp div on
SetViewportOrgEx 與 SetWindowOrgEx 解析
這兩個函數,用來改變視連接埠和視窗的原點,並都具有改變軸的效果,以致(0,0)不再指左上方。
「視連接埠」是依據裝置座標(圖素)的。通常,視連接埠和顯示地區相同.視連接埠也可以是指整視窗座標或者螢幕座標。點(0,0)是顯示地區(或者整個視窗或螢幕)的左上方,x的值向右增加,y的值向下增加。
「視窗」是依據邏輯座標的,邏輯座標可以是圖素、毫米、英寸或者您想要的任何其它單位。
對於視連接埠和視窗的概念可以這樣理解: 幻想顯示器大小可以隨便改變,那麼顯示器每次都變成view「視連接埠」的太小就可以了,window「視窗」就沒存在的必要了。
view「視連接埠」就是實際所需的大小; window「視窗」就是顯示器給你的限制。
再來看下Windows中的幾種座標體系
1、螢幕座標
螢幕座標描述物理裝置(顯示器、印表機等)的一種座標體系,座標原點在螢幕的左上方,X軸向右為正,Y軸向下為正。度量單位是圖素。原點、座標軸方向、度量單位都是不能夠改變的。
2、裝置座標(又稱物理座標)
裝置座標是描述在螢幕和印表機顯示或列印的表單的一種座標體系。座標原點是在其客戶區的左上方。X軸向右為正,Y軸向下為正。度量單位為圖素。原點和座標軸方向可以改變,但是度量單位不可以改變。
3、邏輯座標
邏輯座標是在程式中控制顯示,列印使用的座標體系。該座標系與定義的映射模式密切相關。預設的映射模式是MM_TEXT。我們可以通過設定不同的映射模式來改變該座標體系的預設行為。 我們使用邏輯座標系繪圖,然後要在裝置座標系下顯示。所以就有一個邏輯座標和裝置座標之間的轉換。
SetViewportOrgEx的參數總是使用裝置座標系單位(圖素)。 假設顯示地區為cxClient個圖素寬和cyClient個圖素高。映像方式為MM_TEXT。 如果想將邏輯點(0,0)定義為顯示地區的中心,可進行如下呼叫:
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; 邏輯點(0,0)將映像為裝置點(cxClient/2,cyClient/2)。
顯示地區的座標系變成如下形狀:
SetWindowOrgEx的參數總是使用邏輯單位。 要想獲得與上面使用SetViewportOrgEx同樣的效果則可以進行如下呼叫:
SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ; 邏輯點(-cxClient / 2,-cyClient / 2)映像為裝置點(0,0),即顯示地區的左上方。
很多人對於SetWindowOrgEx使用負數座標參數表示很困惑,當然也包括我自己。進過幾天的思考,終於恍然大悟。這裡做一下解釋。
首先要知道 不管對視窗和視連接埠原點作什麼改變,裝置座標點(0,0)始終是顯示地區的左上方。
我是這樣理解的,視窗(邏輯)原點始終指向視連接埠(裝置)原點。這樣就很好解釋了。
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; 邏輯點(0,0)將映像為裝置點(cxClient/2,cyClient/2)。
設定視連接埠中心點為裝置原點,邏輯原點映射之。
SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ; 邏輯點(-cxClient / 2,-cyClient / 2)映像為裝置點(0,0),即顯示地區的左上方。
將邏輯原點起始座標設定為 (-cxClient / 2,-cyClient / 2),再映射到裝置原點。
假設函數調用時座標:
首先,將座標(-50 , -50)設定為邏輯原點的起始座標。
然後,將邏輯原點映射到裝置原點,這裡是顯示地區的左上方。
函數調用後改變為:
當我們使用邏輯座標-50,-50的時候,被映像到了裝置原點,也就是顯示地區的左上方。
當我們使用邏輯座標0,0的時候,便被映像到了裝置中心點。
我們繪圖的時候使用的是邏輯座標,系統顯示映像的時候是使用裝置座標,所以會有一個轉換過程。
現在我們在邏輯座標50,50處進行繪圖,映像方式為MM_TEXT(轉換比率1:1),系統顯示時轉換為裝置座標:
裝置座標點X = (50 - (-50 ) ) * (1/1) + 0 = 100
裝置座標點Y = (50 - (-50 ) ) * (1/1) + 0 = 100
這下清楚了吧。
再附下裝置座標與邏輯座標的轉換公式:
裝置座標點X = (待轉換的邏輯點X - 邏輯座標的視窗原點X) * (裝置座標的視連接埠範圍X / 邏輯座標的視窗範圍X) + 裝置座標的視連接埠原點X
邏輯座標點X = (待轉換的裝置點x - 裝置座標的視連接埠原點x) * (邏輯座標的視窗範圍x / 裝置座標的視連接埠範圍x) + 邏輯座標的視窗原點x
原文地址:http://blog.csdn.net/typecool/article/details/5898110
【轉載】GDI 映像方式 之 SetViewportOrgEx 與 SetWindowOrgEx 解析