virtual int SetMapMode( int nMapMode );
函數(shù)功能描述:該函數(shù)設(shè)置指定設(shè)備環(huán)境的映射方式,映射方式定義了將邏輯單位轉(zhuǎn)換為設(shè)備單位的度量單位,并定義了設(shè)備的X、Y軸的方向。
nMapMode:指定新的映射方式,此參數(shù)可以是下面列出的任何一個值。
MM_ANISOTROPIC:邏輯單位轉(zhuǎn)換成具有任意比例軸的任意單位,用SetWindowExtEx和SetViewportExtEx函數(shù)可指定單位、方向和比例。
MM_HIENGLISH:每個邏輯單位轉(zhuǎn)換為0.001英寸,X的正方面向右,Y的正方向向上。
MM_HIMETRIC:每個邏輯單位轉(zhuǎn)換為0.01毫米,X正方向向右,Y的正方向向上。
MM_ISOTROPIC:邏輯單位轉(zhuǎn)換成具有均等比例軸的任意單位,即沿X軸的一個單位等于沿Y軸的一個單位,用和函數(shù)可以指定該軸的單位和方向。圖形設(shè)備界面(GDI)需要進(jìn)行調(diào)整,以保證X和Y的單位保持相同大?。ó?dāng)設(shè)置窗口范圍時,視口將被調(diào)整以達(dá)到單位大小相同)。
MM_LOENGLISH:每個邏輯單位轉(zhuǎn)換為0.1英寸,X正方向向右,Y正方向向上。
MM_LOMETRIC:每個邏輯單位轉(zhuǎn)換為0.1毫米,X正方向向右,Y正方向向上。
MM_TEXT:每個邏輯單位轉(zhuǎn)換為一個圖素,X正方向向右,Y正方向向下。
MM_TWIPS;每個邏輯單位轉(zhuǎn)換為打印點(diǎn)的1/20(即1/1400英寸),X正方向向右,Y方向向上。
備注:
MM_TEXT方式允許應(yīng)用程序以設(shè)備像素為單位來工作,像素的大小根據(jù)設(shè)備不同而不同。MM_HIENLISH, MM_HIMETRIC, MM_LOENGLISH, MM_LOMETRIC和MM_TWIPS方式對必須用物理意義單位(如英寸或毫米)制圖的應(yīng)用程序是非常有用的。MM_ISOTROPIC方式保證了1:1的縱橫比。MM_HIENLISH方式允許對X和Y坐標(biāo)分別進(jìn)行調(diào)整。
SetWindowOrg和SetViewportOrg這兩個函數(shù)比較難搞懂,經(jīng)過本人的google和實(shí)踐終于弄明白了這兩個函數(shù)的本質(zhì)區(qū)別。
1.SetWindowOrg(x, y) 是把設(shè)備坐標(biāo)的原點(diǎn)(視口)映射到邏輯坐標(biāo)的(X, Y)處
2.SetViewportOrg(x, y) 是把邏輯坐標(biāo)的原點(diǎn)(窗口)映射到設(shè)備坐標(biāo)的(X, Y)處
3. 設(shè)備原點(diǎn)永遠(yuǎn)是客戶區(qū)的左上角頂點(diǎn)(upper left corner of the client area)。
(后面的一幅圖顯示了這兩個函數(shù)的意義)
注意設(shè)備坐標(biāo)和邏輯坐標(biāo)的區(qū)別:
1.設(shè)備坐標(biāo)的X, Y軸方向是固定的,單位也是固定的,X軸向右遞增,Y向下遞增,單位都是像素。
2.邏輯坐標(biāo)的X, Y軸方向不固定,單位也不固定,根據(jù)選擇的映射模式而變化。
有了以上的解釋,相信大家應(yīng)該能明白為什么下面的代碼的現(xiàn)實(shí)結(jié)果會是這樣的了吧。
void CEx05aView::On
{
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(100, 100);
pDC->Rectangle(0, 0, 200, 200);
pDC->SetViewportOrg(100, 100);
pDC->SelectStockObject(GRAY_BRUSH);
pDC->Rectangle(0, 0, 200, 200);
}
建立一個合適的坐標(biāo)系可以為我們的繪圖帶來很大的方便 。下面介紹一下如何在VC中建立我們想要的坐標(biāo)系。
一 設(shè)備坐標(biāo)和邏輯坐標(biāo)
設(shè)備坐標(biāo)(Device Coordinate)又稱為物理坐標(biāo)(Physical Coordinate),是指輸出設(shè)備上的坐標(biāo)。通常將屏幕上的設(shè)備坐標(biāo)稱為屏幕坐標(biāo)。設(shè)備坐標(biāo)用對象距離窗口左上角的水平距離和垂直距離來指定對象的位 置,是以像素為單位來表示的,設(shè)備坐標(biāo)的X軸向右為正,Y軸向下為正,坐標(biāo)原點(diǎn)位于窗口的左上角。
邏輯坐標(biāo)(Logical Coordinate)是系統(tǒng)用作記錄的坐標(biāo)。在缺省的模式(MM_TEXT)下,邏輯坐標(biāo)的方向和單位與設(shè)備坐標(biāo)的方向和單位相同,也是以像素為單位來 表示的,X軸向右為正,Y軸向下為正,坐標(biāo)原點(diǎn)位于窗口的左上角。邏輯坐標(biāo)和設(shè)備坐標(biāo)即使在缺省模式下其數(shù)值也未必一致,除了在以下兩種情況下:
1. 窗口為非滾動窗口
2. 窗口為滾動窗口,但垂直滾動條位于滾動邊框的最上端,水平滾動條位于最左端,但如果移動了滾動條這兩種坐標(biāo)就不一致了。
在VC中鼠標(biāo)坐標(biāo)的坐標(biāo)位置用設(shè)備坐標(biāo)表示,但所有GDI繪圖都用邏輯坐標(biāo)表示,所以用鼠標(biāo)繪圖時,那么必須將設(shè)備坐標(biāo)轉(zhuǎn)換為邏輯坐標(biāo),可以使用 CDC 函數(shù)DptoLP()將設(shè)備坐標(biāo)轉(zhuǎn)化為邏輯坐標(biāo),同樣可以用LptoDP()將邏輯坐標(biāo)轉(zhuǎn)化為設(shè)備坐標(biāo)。
二 坐標(biāo)模式
為了在不同的領(lǐng)域使用邏輯坐標(biāo),Windows提供了以下8種坐標(biāo)模式:
分別為MM_TEXT、MM_HIENGLISH、MM_LOENGLISH、MM_HIMETRIC、MM_LOMETRIC、MM_TWIPS、MM_ANISOTROPIC和MM_ISOTROPIC。
三 實(shí)例解析
?。ㄒ唬?建立以左上角為原點(diǎn),X軸和Y軸為1000的坐標(biāo),如下圖
我們可以用以下代碼:
void CTtView::On
{
CTtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetViewportOrg(0,0);
pDC->SetViewportExt(rect.right,rect.bottom);
pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(1000,1000);
pDC->MoveTo(50,50);
pDC->LineTo(50,950);
pDC->LineTo(950,950);
pDC->LineTo(50,50);
}
代碼分析:
1. GetClientRect(&rect); 取得客戶區(qū)矩形區(qū)域,將其存放在rect中
2. 用pDC->SetMapMode(MM_ANISOTROPIC); 設(shè)置映射模式
3. 通過pDC->SetViewportOrg(0,0);設(shè)置邏輯坐標(biāo)的原點(diǎn)。
4. 通過pDC->SetViewportExt(rect.right,rect.bottom);和
pDC->SetWindowExt(1000,1000);來確定邏輯坐標(biāo)下和設(shè)備坐標(biāo)下的尺寸對應(yīng)關(guān)系
5. 在MM_ANISOTROPIC模式下,X軸單位和Y軸單位可以不相同
6. 坐標(biāo)方向的確定方法是如果邏輯窗范圍和視口范圍符號相同,則邏輯坐標(biāo)的方向和視口的方向相同,即X軸向右為正,Y軸向下為正。
7. 如果將顯示模式改為MM_ISOTROPIC,那么X軸單位和Y軸單位一定相同,感興趣的讀者可以自己使一下。
?。ǘ?建立以視窗中心為原點(diǎn)的坐標(biāo),如下:
用如下代碼:
void CTtView::On
{
CTtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetViewportOrg(rect.right/2,rect.bottom/2);
pDC->SetViewportExt(rect.right,rect.bottom);
pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(1000,-1000);
pDC->MoveTo(150,150);
pDC->LineTo(-150,-200);
pDC->LineTo(150,-150);
pDC->LineTo(150,150);
}
代碼分析:
1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 設(shè)置視口的原點(diǎn)。
2. 用pDC->SetViewportExt(rect.right,rect.bottom);和pDC->SetWindowExt(1000,-1000);來確定設(shè)備坐標(biāo)和邏輯坐標(biāo)的單位對應(yīng)關(guān)系。
3. 因?yàn)檫壿嫶胺秶鸵暱诜秶姆柌灰恢?,縱坐標(biāo)取反,所以Y軸向上為正。
MM_LOENGLISH、MM_HIENGLISH、MM_LOMETRIC、MM_HIMETRIC、MM_TWIPS這一組是Windows提供的重要的固定比例映射模式。
它們都是x值向右方向遞增,y值向下遞減,并且無法改變。它們之間的區(qū)別在于比例因子見下:(我想書上P53頁肯定是印錯了,因?yàn)橥ㄟ^程序?qū)嶒?yàn)x值向右方向也是遞增的)
MM_LOENGLISH 0.01英寸
MM_HIENGLISH 0.001英寸
MM_LOMETRIC 0.1mm
MM_HIMETRIC 0.01mm
MM_TWIPS 1/1440英寸 //應(yīng)用于打印機(jī),一個twip相當(dāng)于1/20磅,一磅又相當(dāng)于1/72英寸。