程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 理解Windows坐標系

理解Windows坐標系

編輯:關於C語言

理解Windows坐標系 一.設備坐標和邏輯坐標 設備坐標Device Coordinate)又稱為物理坐標Physical Coordinate),是指輸出設備上的坐標。通常將屏幕上的設備坐標稱為屏幕坐標。設備坐標用對象距離窗口左上角的水平距離和垂直距離來指定對象的位置,是以像素為單位來表示的,設備坐標的X軸向右為正,Y軸向下為正,坐標原點位於窗口的左上角。 屏幕上有三種不同的物理坐標,每種物理坐標是固定死的,原點,XY軸方向都不變。 1、客戶區域坐標,包括應用程序的客戶區域,客戶區域的左上角為0, 0)。 2、屏幕坐標,包括整個屏幕,屏幕的左上角為0, 0)。 用函數ClientToScreenScreenToClient可以將客戶區域坐標轉換成屏幕區域坐標,或反之。 3、全窗口坐標,包括一個程序的整個窗口,包括標題條、菜單、滾動條和窗口框,窗口的左上角為0,0)。 邏輯坐標Logical Coordinate)是系統用作記錄的坐標,是以邏輯單位為單位來表示的。在缺省的模式MM_TEXT)下,邏輯坐標的方向和單位與設備坐標的方向和單位相同,也是以像素為單位來表示的,X軸向右為正,Y軸向下為正,坐標原點位於窗口的左上角。 邏輯坐標有多種映射模式,可以改變坐標方向和每個邏輯單位的大小。 畫圖在邏輯坐標中畫,使用邏輯單位,顯示圖形在物理坐標中顯示。 .窗口和視口 視口:以像素(即設備坐標)為坐標單位,即用戶在屏幕上所觀察到的應用程序客戶區的一塊屏幕區域。 窗口:應用程序中的坐標范圍,對應邏輯坐標,如1km×2km,在顯示時,Windows需要將窗口坐標(即邏輯坐標)映射到視口坐標中(即設備坐標) 這裡說的窗口應該是概念上的世界窗口,比如你要顯示的圖象是2000*3000像素,則這個窗口就是2000*3000像素。而視口是定義在屏幕窗口上的一塊區域,比如定義為200*300像素的屏幕窗口區域,且與世界窗口的映射是1:1,則視口不能完全顯示世界窗口的內容,需要滾動。一般視口是定義為屏幕窗口顯示區域的大小。        考察窗口和視口主要考察它們的原點坐標的設置SetViewportOrgSetWindowOrg)和坐標單位映射關系SetViewportExtSetWindowExt)。 . SetViewportOrgSetWindowOrg 1.SetWindowOrg 是把設備坐標的原點移動到邏輯坐標的(X, Y)處。 2.SetViewportOrg 是把邏輯坐標的原點移動到設備坐標的(X, Y)處。 參見Sample0. . SetWindowExtSetViewportExt 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個邏輯點數學上的長度)。cxcy看起來好像是為了設定描畫范圍參數,其實不然。很簡單,它們是代表邏輯長度與物理長度的比值的分子和分母。正負符號也可以設定。當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個單位,邏輯坐標的(00)到什麼地方去了呢? :還是(0,0) 分析:滾動條移動是視口移動了.變化的是視口的坐標原點,相當於SetViewportOrg(-10,0)函數的功能。

本文出自 “沙鷗-專注於網絡信息采集” 博客,請務必保留此出處http://freebird.blog.51cto.com/372076/269061

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved