映射模式決定邏輯座標如何轉換為裝置座標(像素)。預設 `MM_TEXT`(X 右增、Y 下增、1 邏輯單位 = 1 像素)適合螢幕,但列印時圖形會變極小。使用公制/英制映射模式或自訂 `MM_ANISOTROPIC`,可實現螢幕與列印「所見即所得」的尺寸一致性。
| 模式 | 單位換算 | X 方向 | Y 方向 | 原點 |
|---|---|---|---|---|
| MM_TEXT | 1 像素 | 右增 | 下增 | 左上 |
| MM_HIENGLISH | 0.001 英吋 | 右增 | 上增 | 左上 |
| MM_HIMETRIC | 0.01 公釐 | 右增 | 上增 | 左上 |
| MM_LOENGLISH | 0.01 英吋 | 右增 | 上增 | 左上 |
| MM_LOMETRIC | 0.1 公釐 | 右增 | 上增 | 左上 |
| MM_TWIPS | 1/1440 英吋 | 右增 | 上增 | 左上 |
除 `MM_TEXT` 外,Y 軸皆向上(符合數學慣例),繪圖時上方區域需用負座標。
需依序呼叫:
系統依「視窗範圍 / 視口範圍」比值計算縮放。X、Y 可不同比例,實現非等比縮放。
void CMyView::OnDraw(CDC* pDC) {
// 預設 MM_TEXT:畫 200x200 藍方塊
CRect r1(200, 0, 400, 200);
pDC->FillSolidRect(r1, RGB(0,0,255));
// 切換非等比映射
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(5, 5); // 邏輯 5x5
pDC->SetViewportExt(5, 10); // 裝置 5x10 → Y 方向放大 2 倍
// 同樣邏輯 200x200,實際繪製為 200x400 綠長方形
CRect r2(0, 0, 200, 200);
pDC->FillSolidRect(r2, RGB(0,128,0));
}
`CPoint SetViewportOrg(POINT pt)` 將邏輯原點 (0,0) 移至裝置座標 `pt`。例如 `SetViewportOrg(20,20)` 後,原邏輯 (0,0) 變為裝置 (-20,-20),繪圖整體右下偏移。