<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      Windows編程中的映射模式與坐標轉換

      [摘要]一、Windows中的映射模式1、Windows定義映射模式的目的經過我的綜合,Windows定義映射模的目的又以下幾個方面:1、不同人的使用習慣。不同國家的,不同地區,以及不同的人因為習慣喜歡用不...
      一、Windows中的映射模式
      1、Windows定義映射模式的目的
      經過我的綜合,Windows定義映射模的目的又以下幾個方面:1、不同人的使用習慣。不同國家的,不同地區,以及不同的人因為習慣喜歡用不同的度量單位,有的人人喜歡用英寸,而有的人喜歡用公制中的厘米,毫米等。其他的人又喜歡用另外一些單位。、2、使軟件與硬件向分離開來。讓開發的軟件能夠最大限度的與硬件無關。3、提供邏輯和物理的一種轉換。就相當于銀行的利率。
      2、默認的映射模式
      默認的映射模式使MM_TEXT,它使以象素為單位的。X軸向左為正,Y軸向下為正。默認的坐標原點在左上角。
      3、固定比例映射模式
      固定比例的映射模式有MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH、MM_TWIPS種。它們默認的坐標原點都使在左上角。其區別在于每一個邏輯單位對應的物理大小不一樣。所對用的邏輯單位分別為0.1毫米,0.01毫米,0.01英寸,0.001英寸,1/1440英寸(0.0007英寸)。
      4、可變比例映射模式
      對于可變比例的映射模式用戶可以自己定義一個邏輯單位代表的大小,其大小可以任意。也可以讓這個大小隨環境改變而改變。有MM_ISOTROPIC,MM_ANISOTROPIC這兩種映射模式。其邏輯單位的大小等于視口范圍和窗口范圍的比值。兩者的不同在于前者要求X軸和Y軸的度量單位必須相同,而后者沒有這樣的限制。
      二、Windows中的幾種坐標體系
      1、屏幕坐標
      屏幕坐標描述物理設備(顯示器、打印機等)的一種坐標體系,坐標原點在屏幕的左上角,X軸向右為正,Y軸向下為正。度量單位是象素。原點、坐標軸方向、度量單位都是不能夠改變的。
      2、設備坐標(又稱物理坐標)
      設備坐標是描述在屏幕和打印機顯示或打印的窗體的一種坐標體系。默認的坐標原點是在其客戶區的左上角。X軸向右為正,Y軸向下為正。度量單位為象素。原點和坐標軸方向可以改變,但是度量單位不可以改變。
      3、邏輯坐標
      邏輯坐標是在程序中控制顯示,打印使用的坐標體系。該坐標系與定義的映射模式密切相關。默認的映射模式是MM_TEXT。我們可以通過設置不同的映射模式來改變該坐標體系的默認行為。
      三、邏輯坐標和設備坐標之間的轉換
      現有如下代碼:
      void CMapModeView::OnPaint()
      {
      CPaintDC dc(this);

      //獲取設備類的設置
      CPoint ptOrgView,ptOrgWindow;
      CSize sizeView,sizeWindow;
      CString strMsg;

      ptOrgView=dc.GetViewportOrg();//獲取視口原點
      ptOrgWindow=dc.GetWindowOrg();//獲取窗口原點
      sizeView=dc.GetViewportExt();//獲取視口范圍
      sizeWindow=dc.GetWindowExt();//獲取窗口范圍

      strMsg.Format(_T("Viewport Extent:(%d,%d),\tViewport Org:(%d,%d)\tWindow Extent:(%d,%d)\tWindow Org(%d,%d)"),
      sizeView.cx,sizeView.cy,ptOrgView.x,ptOrgView.y,
      sizeWindow.cx,sizeWindow.cy,ptOrgWindow.x,ptOrgWindow.y);
      TRACE("%s\n",strMsg);

      //設置映射模式以及原點
      dc.SetMapMode(MM_TEXT);//設置映射模式
      dc.SetWindowOrg(100,100);//設置窗口的坐標原點
      dc.SetViewportOrg(200,200);//設置視口的坐標原點

      dc.SetWindowExt(5,10);//改語句僅對可變比例映射模式有效
      dc.SetViewportExt(1,1);//同上

      ptOrgView=dc.GetViewportOrg();
      ptOrgWindow=dc.GetWindowOrg();
      sizeView=dc.GetViewportExt();
      sizeWindow=dc.GetWindowExt();
      strMsg.Format(_T("Viewport Extent:(%d,%d),\tViewport Org:(%d,%d)\tWindow Extent:(%d,%d)\tWindow Org(%d,%d)"),
      sizeView.cx,sizeView.cy,ptOrgView.x,ptOrgView.y,
      sizeWindow.cx,sizeWindow.cy,ptOrgWindow.x,ptOrgWindow.y);
      TRACE("%s\n",strMsg);

      //將點(300,400)從邏輯坐標體系映射到設備坐標體系。
      CPoint ptMap;
      ptMap=CPoint(300,400);
      dc.LPtoDP(&ptMap);
      strMsg.Format(_T("The Orginal Point(In LP):CPoint(300,400),Convert to DP is:CPoint(%d,%d)"),
      ptMap.x,ptMap.y);
      TRACE("%s\n",strMsg);

      //將點(300,400)從設備坐標體系映射到邏輯坐標體系
      ptMap=CPoint(300,400);
      dc.DPtoLP(&ptMap);
      strMsg.Format(_T("The Orginal Point(In DP):CPoint(300,400),Convert to LP is:CPoint(%d,%d)"),
      ptMap.x,ptMap.y);
      TRACE("%s\n",strMsg);
      }
      以上代碼最后調試輸出結果為:
      Viewport Extent:(1,1), Viewport Org:(0,0) Window Extent:(1,1) Window Org(0,0)
      Viewport Extent:(1,1), Viewport Org:(200,200) Window Extent:(1,1) Window Org(100,100)
      The Orginal Point(In LP):CPoint(300,400),Convert to DP is:CPoint(400,500)
      The Orginal Point(In DP):CPoint(300,400),Convert to LP is:CPoint(200,300)
      按照MSDN上,函數SetWindowOrg(x,y)設定設備坐標下的點(x,y)對應于邏輯坐標的原點。SetVieportOrg(x,y)設定邏輯坐標下點(x,y)對應邏輯坐標的原點。而實際上如果同時設置了邏輯坐標和設備坐標原點的話,那么以上的說法是錯誤的。
      在默認映射模式MM_TEXT下,一個邏輯單位對應于設備坐標下的一個象素。改變默認原點以后的坐標體系如下圖所示:
      (0,0)              Dx,Lx       (0,0)                             
      (100,100)                      Lx
      (200,200)                  Dx
       .(300,400)



      Dy,Ly                                Ly  Dy
      在VC中坐標系的轉換和數學中的數學轉化是不一樣的。在這里是以距離為標準。首先看一下如何把點(300,400)如何從設備坐標轉換成邏輯坐標。
      在設備坐標體系下,點(300,400)與Y軸的距離為100個邏輯單位。那么所對應的邏輯坐標也要滿足與邏輯坐標Y軸的距離為100個單位。又1個邏輯單位對應1個象素。所以所對應的設備坐標的X值為100+100=200。同樣可以出對應的邏輯坐標的Y值為300。
      按照同樣的方法,我們也可以把邏輯坐標下的點(300,400)轉換成設備坐標。在邏輯坐標下,點(300,400)與邏輯坐標Y軸的距離為200。那么在設備坐標體系,相應的設備坐標與設備坐標Y軸的距離也要為200。又1個邏輯單位對應1個象素,所以對應的設備坐標X值為200+200=400。同樣的道理,可以求出對應的設備坐標Y值為500。
      在這里,因為邏輯單位和設備單位一一對應,也可以把這個問題看作一個很簡單的坐標平移問題來看。其結果是很顯然的。


      日韩精品一区二区三区高清