【轉載】GDI 映像方式 之 SetViewportOrgEx 與 SetWindowOrgEx 解析

來源:互聯網
上載者:User

標籤: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 解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.