一.設備座標和邏輯座標
設備座標(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)函數的功能。