| (1)Windows座標系統 Windows座標系分為邏輯座標系和裝置座標系兩種,GDI支援這兩種座標系。一般而言, GDI的文本和圖形輸出函數使用邏輯座標,而在客戶區移動或按下滑鼠的滑鼠位置是採用裝置座標。 <1>邏輯座標系是面向DC的座標系,這種座標不考慮具體的裝置類型,在繪圖時,Windows會根據當前設定的映射模式將邏輯座標轉換為裝置座標。 <2>裝置座標系是面向物理裝置的座標系,這種座標以像素或裝置所能表示的最小長度單位為單位,X軸方向向右,Y軸方向向下。裝置座標系的原點位置(0, 0)不限定在裝置顯示地區的左上方。 裝置座標系分為螢幕座標系、視窗座標系和客戶區座標系三種相互獨立的座標系。 螢幕座標系以螢幕左上方為原點,一些與整個螢幕有關的函數均採用螢幕座標,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。彈出式菜單使用的也是螢幕座標。 視窗座標系以視窗左上方為座標原點,它包括視窗標題列、功能表列和工具列等範圍。 客戶區座標系以視窗客戶區左上方為原點,主要用於客戶區的繪圖輸出和視窗訊息的處理。滑鼠訊息的座標參數使用客戶區座標,CDC類繪圖成員函數使用與客戶區座標組應的邏輯座標。 下面三種都是顯示裝置的物理座標,它們在螢幕上用真實的物理像素表示 螢幕座標 Screen coordinates: 原點(0,0)位於螢幕的左上方 視窗座標 Window coordinates: 原點(0,0)位於視窗的左上方(包括非客戶區,如標題條) 客戶區座標 Client-window coordinates: 原點(0,0)位於客戶視窗的左上方 邏輯座標是GDI函數在螢幕上顯示資料所用的座標,邏輯座標除非與物理座標相關聯,否則沒有義.windows依靠映射模式解釋邏輯座標.比如預設的模式為MM_TEXT,該模式下,物理座標與邏輯座標是一對一的關係. (2)座標之間的相互轉換 編程時,有時需要根據當前的具體情況進行三種裝置座標之間或與邏輯座標的相互轉換。 MFC提供了兩個函數CDC::DPtoLP()和CDC:: LPtoDP()用於裝置座標與邏輯座標之間的相互轉換。 MFC提供了兩個函數CWnd::ScreenToClient()和CWnd::ClientToScreen()用於螢幕座標與客戶區座標的相互轉換。 (3)映射模式 映射模式確定了在繪製圖形時所依據的座標系,它定義了邏輯單位的實際大小、座標增長方向,所有映射模式的座標原點均在裝置輸出地區(如客戶區或列印區)的左上方。此外,對於某些映射模式,使用者還可以自訂視窗的長度和寬度,設定視圖區的物理範圍。 Windows定義了8種映射模式,見下表。 映射模式使得程式員可不必考慮輸出裝置的具體裝置座標系,而在一個統一的邏輯座標系中進行圖形的繪製。 映射方法(Mapping Mode) 邏輯單位 座標軸方向 MM_TEXT(預設) 1 pixel X軸正方向朝右,Y軸正方向朝下 MM_LOMETRIC 0.1 mm X軸正方向朝右,Y軸正方向朝上 MM_HIMETRIC 0.01 mm X軸正方向朝右,Y軸正方向朝上 MM_LOENGLISH 0.01 inch X軸正方向朝右,Y軸正方向朝上 MM_HIENGLISH 0.001 inch X軸正方向朝右,Y軸正方向朝上 MM_TWIPS 1/1440 inch X軸正方向朝右,Y軸正方向朝上 MM_ISOTROPIC 自訂(X=Y) 自訂 MM_ANISOTROPIC 自訂(X!=Y) 自訂 當繪製的圖形需要隨著視窗的大小改變而自動改變的時候,一般選擇MM_ISOTROPIC和MM_ANISOTROPIC映射方式。它們的唯一區別就是前者的X軸和Y軸的邏輯單位的大小是相同的,單詞“isotropic”就是各個方向相等的意思,此映射方式適合繪製圓或正方形。而實際應用中,常常給X軸和Y軸取不同的比例,這時候選擇MM_ANISOTROPIC映射方式。單詞“anisotropic”就是各個方向相異的意思。 (4)自訂映射模式 “視窗”和“視口”的概念: 視窗(Window):對應邏輯座標繫上程式員設定的地區 視口(Viewport):對應實際輸出裝置上程式員設定的地區 視窗原點是指邏輯視窗座標系的原點在視口(裝置)座標系中的位置,視口原點是指裝置實際輸出地區的原點。 除了映射模式,視窗和視口也是決定一個點的邏輯座標如何轉換為裝置座標的一個因素。一個點的邏輯座標按照如下式子轉換為裝置座標: 裝置(視口)座標 = 邏輯座標 – 視窗原點座標 + 視口原點座標 //定義座標映射方式 WINGDIAPI int WINAPI SetMapMode(HDC, int); 此API函數在MFC中封裝為CDC::virtual int SetMapMode(int nMapMode); //定義邏輯視窗地區,單位為邏輯單位(Logical) WINGDIAPI BOOL WINAPI SetWindowExtEx (HDC, int, int, LPSIZE); 此API函數在MFC中封裝為CDC::virtual CSize SetWindowExt(int cx, int cy); //設定邏輯視窗的原點座標,預設原點為(0,0)。 WINGDIAPI BOOL WINAPI SetWindowOrgEx(HDC, int, int, LPPOINT); 此API函數在MFC中封裝為CDC::CPoint SetWindowOrg(int x, int y); 注意:SetWindowOrg(Ex) 只有在映射模式為MM_ANISOTROPIC或MM_ISOTROPIC時才有意義。 //定義視口的座標軸方向及地區、定義域和範圍,單位為像素(Pixel) WINGDIAPI BOOL WINAPI SetViewportExtEx(HDC, int, int, LPSIZE); 此API函數在MFC中封裝為CDC::virtual CSize SetViewportExt(int cx, int cy); 注意:SetViewportExt(Ex) 只有在映射模式為MM_ANISOTROPIC或MM_ISOTROPIC時才有意義。 //設定視口的原點座標,預設原點為(0,0)。 WINGDIAPI BOOL WINAPI SetViewportOrgEx(HDC, int, int, LPPOINT); 此API函數在MFC中封裝為CDC:: virtual CPoint SetViewportOrg(int x, int y); 轉載請寫明地址:http://hi.baidu.com/yel_bit/blog/item/2507c6f66516b829720eec12.html |