邏輯座標系 設備座標系 客戶座標系 屏幕座標系

(1)Windows座標系統編程

Windows座標系分爲邏輯座標系和設備座標系兩種,GDI支持這兩種座標系。通常而言,GDI的文本和圖形輸出函數使用邏輯座標,而在客戶區移動或按下鼠標的鼠標位置是採用設備座標。windows

<1>邏輯座標系(Logical Coordinate)是面向DC的座標系,這種座標不考慮具體的設備類型,在繪圖時,Windows會根據當前設置的映射模式將邏輯座標轉換爲設備座標。函數

<2> 設備座標(Device Coordinate)又稱爲物理座標(Physical Coordinate),是指輸出設備上的座標。一般將屏幕上的設備座標稱爲屏幕座標。設備座標用對象距離窗口左上角的水平距離和垂直距離來指定對象的位 置,是以像素爲單位來表示的,設備座標的X軸向右爲正,Y軸向下爲正,座標原點位於窗口的左上角,不限定在設備顯示區域的左上角。工具

設備座標系分爲屏幕座標系、窗口座標系和客戶區座標系三種相互獨立的座標系。測試

  • 屏幕座標系以屏幕左上角爲原點,一些與整個屏幕有關的函數均採用屏幕座標,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。彈出式菜單使用的也是屏幕座標。
  • 窗口座標系以窗口左上角爲座標原點,它包括窗口標題欄、菜單欄和工具欄等範圍。
  • 客戶區座標系以窗口客戶區左上角爲原點,主要用於客戶區的繪圖輸出和窗口消息的處理。鼠標消息的座標參數使用客戶區座標,CDC類繪圖成員函數使用與客戶區座標對應的邏輯座標。

下面三種都是顯示設備的物理座標,它們在屏幕上用真實的物理像素表示this

  • 屏幕座標 Screen   coordinates:   原點(0,0)位於屏幕的左上角  
  • 窗口座標 Window   coordinates:   原點(0,0)位於窗口的左上角(包括非客戶區,如標題條)  
  • 客戶區座標 Client-window   coordinates:   原點(0,0)位於客戶窗口的左上角

  邏輯座標是GDI函數在屏幕上顯示數據所用的座標,邏輯座標除非與物理座標相關聯,不然沒有義。windows依靠映射模式解釋邏輯座標。好比缺省的模式爲MM_TEXT,該模式下,物理座標與邏輯座標是一對一的關係。spa

      邏輯座標(Logical Coordinate)是系統用做記錄的座標。在缺省的模式(MM_TEXT)下,邏輯座標的方向和單位與設備座標的方向和單位相同,也是以像素爲單位來 表示的,X軸向右爲正,Y軸向下爲正,座標原點位於窗口的左上角。邏輯座標和設備座標即便在缺省模式下其數值也未必一致,除了在如下兩種狀況下:
  1. 窗口爲非滾動窗口
  2. 窗口爲滾動窗口,但垂直滾動條位於滾動邊框的最上端,水平滾動條位於最左端,但若是移動了滾動條這兩種座標就不一致了。
  在VC中鼠標座標的座標位置用設備座標表示,但全部GDI繪圖都用邏 座標表示,因此用鼠標繪圖時,那麼必須將設備座標轉換爲邏輯座標,可使用CDC 函數DptoLP()將設備座標轉化爲邏輯座標,一樣能夠用LptoDP()將邏輯座標轉化爲設備座標。對象

(2)座標之間的相互轉換事件

編程時,有時須要根據當前的具體狀況進行三種設備座標之間或與邏輯座標的相互轉換。數據

MFC提供了兩個函數CDC::DPtoLP()和CDC:: LPtoDP()用於設備座標與邏輯座標之間的相互轉換。

MFC提供了兩個函數CWnd::ScreenToClient()和CWnd::ClientToScreen()用於屏幕座標與客戶區座標的相互轉換。

(3)映射模式

映射模式肯定了在繪製圖形時所依據的座標系,它定義了邏輯單位的實際大小、座標增加方向,全部映射模式的座標原點均在設備輸出區域(如客戶區或打印區)的左上角。此外,對於某些映射模式,用戶還能夠自定義窗口的長度和寬度,設置視圖區的物理範圍。

Windows定義了8種映射模式,見下表。

 

注意:
首先,要記住兩點:
1。設備座標的(0, 0)點始終是客戶區的左上角。 
2。咱們在繪圖時指定的點所有都是邏輯座標點。
座標轉換
調用CDC::LPtoDP能夠將邏輯座標轉換爲設備座標;
高用CDC::DPtoLP能夠將設備座標轉換爲邏輯座標;
何時用什麼座標系
 能夠認爲CDC的全部成員函數都以邏輯座標做爲參數 
 能夠認爲CWnd的全部成員函數都以設備座標做爲其參數 

全部選中測試操做中都應該考慮設備座標。區域的定義應採用設備座標。
某些像CRect::PtInRect之類的函數只有在採用設備座標參數時纔會保證有正確的結果  將一些須要長期使用的值用邏輯座標或物理座標來保存。 若是用邏輯座標來保存某點的座標的話,那麼只要用戶對窗口進行一下滾動,該點的座標就再也不有效了。  鼠標單擊事件下獲得的座標都是設備座標!  移動原點 CDC::SetViewportOrg()移動視口的原點  CDC::SetWindwosOrg()移動窗口的原點 正常狀況下,只能使用其中之一,同時使用兩個會搞提一團糟。 獲取設備信息 得到系統分辨率 CClientDC dc(this); int cx = dc.GetDeviceCaps(HORZRES); int cy = dc.GetDeviceCaps(VERTRES);

相關文章
相關標籤/搜索