天天看點

了解Windows坐标系

了解Windows坐标系

一.裝置坐标和邏輯坐标

裝置坐标(Device Coordinate)又稱為實體坐标(Physical Coordinate),是指輸出裝置上的坐标。通常将螢幕上的裝置坐标稱為螢幕坐标。裝置坐标用對象距離視窗左上角的水準距離和垂直距離來指定對象的位置,是以像素為機關來表示的,裝置坐标的X軸向右為正,Y軸向下為正,坐标原點位于視窗的左上角。

螢幕上有三種不同的實體坐标,每種實體坐标是固定死的,原點,XY軸方向都不變。

1、客戶區域坐标,包括應用程式的客戶區域,客戶區域的左上角為(0, 0)。

2、螢幕坐标,包括整個螢幕,螢幕的左上角為(0, 0)。

用函數ClientToScreen和ScreenToClient可以将客戶區域坐标轉換成螢幕區域坐标,或反之。

3、全視窗坐标,包括一個程式的整個視窗,包括标題條、菜單、滾動條和視窗框,視窗的左上角為(0,0)。

邏輯坐标(Logical Coordinate)是系統用作記錄的坐标,是以邏輯機關為機關來表示的。在預設的模式(MM_TEXT)下,邏輯坐标的方向和機關與裝置坐标的方向和機關相同,也是以像素為機關來表示的,X軸向右為正,Y軸向下為正,坐标原點位于視窗的左上角。

邏輯坐标有多種映射模式,可以改變坐标方向和每個邏輯機關的大小。

畫圖在邏輯坐标中畫,使用邏輯機關,顯示圖形在實體坐标中顯示。

二.視窗和視口

視口:以像素(即裝置坐标)為坐标機關,即使用者在螢幕上所觀察到的應用程式客戶區的一塊螢幕區域。

視窗:應用程式中的坐标範圍,對應邏輯坐标,如1km×2km,在顯示時,Windows需要将視窗坐标(即邏輯坐标)映射到視口坐标中(即裝置坐标)。

這裡說的視窗應該是概念上的世界視窗,比如你要顯示的圖象是2000*3000像素,則這個視窗就是2000*3000像素。而視口是定義在螢幕視窗上的一塊區域,比如定義為200*300像素的螢幕視窗區域,且與世界視窗的映射是1:1,則視口不能完全顯示世界視窗的内容,需要滾動。一般視口是定義為螢幕視窗顯示區域的大小。

       考察視窗和視口主要考察它們的原點坐标的設定(SetViewportOrg,SetWindowOrg)和坐标機關映射關系(SetViewportExt,SetWindowExt)。

三. SetViewportOrg和SetWindowOrg

1.SetWindowOrg 是把裝置坐标的原點移動到邏輯坐标的(X, Y)處。

2.SetViewportOrg 是把邏輯坐标的原點移動到裝置坐标的(X, Y)處。

參見Sample0.

四. SetWindowExt和SetViewportExt

SetWindowExe設定視窗尺寸,SetViewportExt設定視口尺寸,視窗尺寸以邏輯機關計算,視口尺寸以實體機關計算。

調用SetMapMode(MM_ANISOTROPIC)時,邏輯描畫領域坐标系的原點與畫面的左上角是重疊的。然後需要調用SetWindowExt()函數和SetViewportExt()函數,來設定縱軸橫軸的単位和方向以及伸縮比例。

virtual CSize SetWindowExt(int cxWindow, int cyWindow);

virtual CSize SetViewportExt(int cxViewport, int cyViewport);

一般說SetWindowExt()函數和SetViewportExt()函數要成對調用。它們的意思(功能)是:用cxViewport個實體像素來表現cxWindow個邏輯點(數學上的長度)。同樣用cyViewport個實體像素來表現cyWindow個邏輯點(數學上的長度)。cx和cy看起來好像是為了設定描畫範圍參數,其實不然。很簡單,它們是代表邏輯長度與實體長度的比值的分子和分母。正負符号也可以設定。當cxViewport/cxWindow為正的情況下,X軸的方向是指向右方,反過來指向左方。 cyViewport/cyWindow為正的情況下,Y軸的方向是指向上方,反過來指向下方。

參見Sample1.

五. SetMapMode

該函數設定指定裝置環境的映射方式,映射方式定義了将邏輯機關轉換為裝置機關的度量機關,并定義了裝置的X、Y軸的方向。

Windows定義了8種映射方式,它們在WINGDI.H中相應的識别字和含義如表5-5所示。

映射方式

邏輯機關

x值(增加)

y值(增加)

MM_TEXT

圖素

MM_LOMETRIC

0.1mm

MM_HIMETRIC

0.01mm

MM_LOENGLISH

0.01in

MM_HIENGLISH

0.001in

MM_TWIPS

1/1440in

MM_ISOTROPIC

任意(x=y)

可選

MM_ANISOTROPIC

任意(x!=y)

參見Sample2.

六.綜合運用1(加入滾動條)

       滾動條的作用:用來幫助尺寸有限的螢幕視窗顯示區域察看無限大的邏輯空間中的内容。邏輯空間是無限大的,螢幕視窗是有限的,利用滾動條可以觀察到更多邏輯空間中的内容。

    SCROLLINFO si;

    si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;

    si.nMin = 0;

    si.nMax = nHScrollMax;

    si.nPos = m_nHScrollPos;

    si.nPage = m_nHPageSize;

SetScrollInfo (SB_HORZ, &si, TRUE);

設定垂直方向上可以觀察到的邏輯空間内容的範圍。

滾動條位置坐标是裝置坐标。

參見Sample3.

七.綜合運用2(加入滾動條及圖檔縮放)

參見Sample4.

八.最後總結

① 可以認為CDC的所有成員函數都以邏輯坐标為參數。

② 可以認為CWnd的所有成員函數都以裝置坐标為參數。

畫圖并移動圖像的步驟:

1.在腦海中建立邏輯坐标,實體坐标。

2.确定邏輯坐标的映射模式(即确定軸方向和像素點大小)。

3.用CDC函數開始在邏輯坐标中畫圖。

4.使用視口或視窗原點來移動圖像到想要的位置。(設定視口或視窗原點)。

問:當滾動條右向拉10個機關,邏輯坐标的(0,0)到什麼地方去了呢?

答:還是(0,0)

分析:滾動條移動是視口移動了.變化的是視口的坐标原點,相當于SetViewportOrg(-10,0)函數的功能。

<a href="http://down.51cto.com/data/2355021" target="_blank">附件:http://down.51cto.com/data/2355021</a>

本文轉自 xchsp 51CTO部落格,原文連結:http://blog.51cto.com/freebird/269061,如需轉載請自行聯系原作者

繼續閱讀