理解對映方式、裝置座標系、邏輯座標系、設定邏輯座標原點與裝置座標原點
一、關於對映方式
參考的網路文章地址:http://blog.csdn.net/xuyongbeijing2008/article/details/8063801
對映方式定義了將邏輯單位轉換為裝置單位的度量單位,並定義了邏輯座標系的X、Y軸的方向。所以,對映方式不僅影響邏輯單位的尺寸,也影響Y軸的正方向。
GDI的八種對映方式及其意義:
MM_TEXT:每個邏輯單位轉換為一個圖素,X正方向向右,Y正方向向下。(僅此一種方式是Y向下為正方向的)
M_LOMETRIC:每個邏輯單位轉換為0.1毫米,X正方向向右,Y正方向向上。
MM_LOENGLISH:每個邏輯單位轉換為0.1英寸,X正方向向右,Y正方向向上。
MM_HIENGLISH:每個邏輯單位轉換為0.001英寸,X的正方面向右,Y的正方向向上。
MM_HIMETRIC:每個邏輯單位轉換為0.01毫米,X正方向向右,Y的正方向向上。
MM_TWIPS;每個邏輯單位轉換為列印點的1/20(即1/1400英寸),X正方向向右,Y方向向上。
MM_ISOTROPIC:邏輯單位轉換成具有均等比例軸的任意單位,即沿X軸的一個單位等於沿Y軸的一個單位,用和函式可以指定該軸的單位和方向。圖形裝置介面(GDI)需要進行調整,以保證X和Y的單位保持相同大小(當設定視窗範圍時,視口將被調整以達到單位大小相同),X正方向向右,Y正方向向上。
MM_ANISOTROPIC:邏輯單位轉換成具有任意比例軸的任意單位(用SetWindowExtEx和SetViewportExtEx函式可指定單位、方向和比例),,X正方向向右,Y正方向向上。
二、裝置(物理)座標系與邏輯座標系的理解
裝置座標系有三種:客戶區座標系、視窗座標系、螢幕座標系。
有一點非常重要,裝置座標系的X、Y軸的方向是固定的,單位也是固定的,X軸向右遞增,Y向下遞增,裝置點(0,0)始終是客戶區、視窗區或者螢幕區的左上角(也即是出圖時候看到的)。對映方式只是針對邏輯座標系的。
邏輯座標系:
所有的GDI繪圖操作的座標都是在邏輯座標系下座標。當對映方式為MM_TEXT時(也是預設的對映方式),邏輯座標系與裝置座標系是相同的。下面我們用其他的對映方式來試驗一下。比如:
pDC->SetMapMode( MM_LOMETRIC ); //此時Y軸向上為正,X軸向右為正
pDC->SelectStockObject( GRAY_BRUSH );
pDC->Rectangle(100,-100,400,-400); //此時的座標都是邏輯座標哦
結果如下所示:
三、函式CDC::SetWindowOrg與CDC::SetViewPortOrg的理解
函式CDC::SetWindowOrg是改變視窗(邏輯座標)原點,如SetWindowOrg(100,100)則是將邏輯點(100,100)對映到為裝置點(0,0);
函式CDC::SetViewPortOrg是改變視口(設定座標)原點,如SetViewPortOrg(100,100)則是將裝置點(100,100),對映到為邏輯點(0,0)(注意:裝置點(100,100)不要等同於邏輯點的(100,100));
分別舉兩個例子:
運用CDC::SetWindowOrg舉例如下:
pDC->SetMapMode( MM_LOMETRIC ); //此時Y軸向上為正,X軸向右為正
pDC->SelectStockObject( DKGRAY_BRUSH );
pDC->SetWindowOrg(100,100); ////將邏輯點(100,100)對映到裝置點(0,0)上
pDC->Rectangle(100,-100,400,-400); //此時的座標都是邏輯座標哦
運用CDC::SetViewPortOrg舉例如下:
pDC->SetMapMode( MM_LOMETRIC ); //此時Y軸向上為正,X軸向右為正
pDC->SelectStockObject( DKGRAY_BRUSH );
pDC->SetViewportOrg( 100, 100 ); //將裝置點(100,100)對映到邏輯點(0,0)上
pDC->Rectangle(100,-100,400,-400); //此時的座標都是邏輯座標哦