1. 程式人生 > >邏輯座標與裝置座標——全視窗座標、螢幕座標、客戶區座標的總結

邏輯座標與裝置座標——全視窗座標、螢幕座標、客戶區座標的總結

Windows應用程式繪製圖形時使用的是一種邏輯單位,每個邏輯單位的大小由對映模式決定,這個邏輯單位既可以與裝置單位(螢幕或印表機上的一個畫素點)相同,也可以是一種物理單位(如毫米),還可以是使用者自定義的一種單位。在Windows應用程式中,只要與輸出有關係,都要使用對映模式。

首先談談對映模式基本知識,當Windows應用程式在其客戶區繪製圖形時,必須給出在客戶區的位置,其位置用x和y 兩個座標表示,x表示橫座標,y表示縱座標。在所有的GDI繪製函式中,這些座標使用的是一種"邏輯單位"。當GDI函式將輸出送到某個物理裝置上時,Windows將邏輯座標轉換成裝置座標(如螢幕或印表機的畫素點)。邏輯座標和裝置座標的轉換是由對映模式決定的。對映模式被儲存在裝置環境中。GetMapMode函式用於從裝置環境得到當前的對映模式,SetMapMode函式用於設定裝置環境的對映模式。

裝置座標(Device Coordinate)又稱物理座標(Physical Coordinate),指輸出裝置上的座標。通常將螢幕上的裝置座標稱為螢幕座標。裝置座標用物件距離視窗左上角的水平距離和垂直距離來指定物件的位置,是以畫素為單位來表示的,裝置座標的X軸向右為正,Y軸向下為正,座標原點位於視窗的左上角。當程式設計師在呼叫一個畫線的GDI函式LineTo,畫出25.4mm(1英寸) 長的線時,他並不需要考慮輸出的是何種裝置。若裝置是VGA顯示器,Windows自動將其轉化為96個畫素點;若裝置是一個300dpi的鐳射印表機,Windows自動將其轉化為300個畫素點。

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

邏輯座標和裝置座標在以下預設模式中一般是一致的:

1.視窗為非滾動視窗

2.視窗為滾動視窗,垂直滾動條位於滾動邊框的最上端,水平滾動條位於最左端

Windows中包括以下3種裝置座標,以滿足各種不同需要:

1.客戶區域座標,包括應用程式的客戶區域,客戶區域的左上角為(0,0)。

2.螢幕座標,包括整個螢幕,螢幕的左上角為(0,0)。螢幕座標用在WM_MOVE訊息中(對於非子視窗)以及下面的Windows函式中:CreateWindow和MoveWindow(都對於非子視窗)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint和SetBrushOrg中。用函式ClientToScreen和ScreenToClient可以將客戶區域座標轉換成螢幕區域座標,或反之。

3.全視窗座標,包括一個程式的整個視窗,包括標題條、選單、滾動條和視窗框,視窗的左上角為(0,0)。使用GetWindowDC得到的視窗裝置環境,可以將邏輯單位轉換成視窗座標。

 

Windows中邏輯座標所在的座標系稱為"視窗",將裝置座標所在的座標系稱為"視口"。

"視窗"依賴於邏輯座標,可以是畫素點、毫米或程式設計師想要的其他尺度。

"視口"依賴於裝置座標(畫素點)。通常,視口和客戶區域等同。但是,如果程式設計師用GetWindowDC或CreateDC獲取了一個裝置環境,則視口也可以指全視窗座標或螢幕座標。點(0,0)是客戶區域的左上角。x的值向右增加,y的值向下增加。

對於所有對映模式,Windows都用下面兩個公式將視窗座標轉換成視口座標:

xViewport=(xWindow-xWinOrg)*(xViewExt/xWinExt)+xViewOrg

yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg

其中,(xWindow,yWindows)是待轉換的邏輯點,(xViewport,yViewport)是轉換後的裝置點,(xWinOrg,yWinOrg)是邏輯座標的視窗原點;(xViewOrg,yViewOrg)是裝置座標的視口原點。在預設的裝置環境中,這兩個點均設定為(0,0),但它們可以改變。此公式意味著,邏輯點(xWinOrg,yWinOrg)總被對映為裝置點(xViewOrg,yViewOrg)。如果裝置座標是客戶區域座標或全視窗座標,則Windows在畫一個物件前,還必須將這些座標轉換成螢幕座標。

Windows還能將視口(裝置)座標轉換為視窗(邏輯)座標:

xWindow=(xViewport-xViewOrg)*(xWinExt/xViewExt)+xWinOrg

yWindow=(yViewport-yViewOrg)*(yWinExt/yViewExt)+yWinOrg

可以使用Windows提供的兩個函式DPtoLP和LPtoDP在裝置座標及邏輯座標之間互相轉換。

Windows定義了8種對映方式。

 

上述對映模式中又可分成以下3類:

MM_TEXT對映模式這種對映模式被稱為"文字"對映方式,不是因為它對於文字最合適,而是軸的方向與讀文字的方向一致。Windows提供了函式SetViewportOrg和SetWindowOrg 用來設定視口和視窗的原點。預設的視窗原點和視口原點均為(0,0),可以改變;預設的視窗範圍和視口範圍均為(1,1),不可改變。

度量對映方式MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH和MM_TWIPS 將1個邏輯單位對映為固定的實際單位,其中1twip等於0.0176mm(1/1440英寸)。其他對映模式對應的物理單位參見表1。設定了對映模式以後,Windows自動設定了視窗及視口的範圍,範圍本身的值並不重要,但範圍比是一個固定的值,對於MM_LOMETRIC,Windows計算範圍比xViewExt/xWinExt=0.1mm中水平畫素的點數。

自定義對映模式MM_ISOTROPIC和MM_ANISOTROPIC兩種對映模式允許程式設計師設定自己的視窗和視口範圍。MM_ISOTROPIC和MM_ANISOTROPIC的區別是所設定的x軸和y軸的的範圍必須相同,而MM_ANISOTROPIC所設定的x軸和y軸的的範圍可以不同。isotropi的意思是“在所有方向相同”,anisotropic的意思正相反。自定義對映模式中視窗和視口的原點和範圍都可以改變,程式設計師可以設定自己需要的對映模式。函式SetWindowExt和SetViewportExt 用於改變視窗和視口的範圍。下面的程式碼將1個邏輯單位對映成0.396mm(1/64英寸)。

SetMapMode(hDC,MM_ISOTROPIC);(WINCE不支援)

SetWindowExt(64,64);

SetViewportExt(hdc,GetDeviceCaps(hdc,LOGPIXELSX),GetDeviceCaps(hdc,LOGPIXELSY));