預設 MM_TEXT 以像素為單位,相同像素尺寸在不同解析度螢幕、印表機上實體大小不同。映射模式定義「邏輯座標」到「裝置座標」的轉換規則,實現跨裝置尺寸一致。
| 模式 | X 向 | Y 向 | 單位 | 可改原點 | 適用場景 |
|---|---|---|---|---|---|
| MM_TEXT | 右增 | 下增 | 像素 | 是 | 螢幕精確像素控制 |
| MM_LOENGLISH | 右增 | 上增 | 0.01 英吋 | 否 | 英制工程圖 |
| MM_HIENGLISH | 右增 | 上增 | 0.001 英吋 | 否 | 高精度英制 |
| MM_LOMETRIC | 右增 | 上增 | 0.1 公釐 | 否 | 公制工程圖 |
| MM_HIMETRIC | 右增 | 上增 | 0.01 公釐 | 否 | 高精度公制 |
| MM_TWIPS | 右增 | 上增 | 1/1440 英吋 | 否 | 排版、列印(1 twip = 1/20 pt) |
| MM_ISOTROPIC | 右增 | 上增 | 自訂 | 是 | 等比例縮放(X/Y 同比例) |
| MM_ANISOTROPIC | 右增 | 上增 | 自訂 | 是 | 非等比例(X/Y 獨立比例) |
void CMyView::OnDraw(CDC* pDC)
{
pDC->SetMapMode(MM_LOMETRIC); // 0.1 mm 單位
// 畫 100mm x 50mm 矩形
pDC->Rectangle(CRect(0, 0, 1000, -500)); // Y 負值因向上增
}
需呼叫 SetWindowExt (邏輯範圍) 與 SetViewportExt (裝置範圍) 定義比例。
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(1000, 1000); // 邏輯 1000x1000
pDC->SetViewportExt(500, -500); // 裝置 500x500 像素,Y 翻轉
// 邏輯 (100,100) 對應裝置 (50,-50),比例 1:0.5 等比例
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000, 2000); // 邏輯寬:高 = 1:2
pDC->SetViewportExt(400, -300); // 裝置寬:高 = 4:3
// X 比例 0.4, Y 比例 0.15,圖形會被拉伸
// 將邏輯原點 (0,0) 移至視窗中心
pDC->SetMapMode(MM_TWIPS);
CRect rect;
GetClientRect(&rect);
pDC->DPtoLP(&rect); // 裝置座標轉邏輯座標
pDC->SetWindowOrg(rect.Width()/2, rect.Height()/2);
// 之後繪製以視窗中心為原點,適合座標系視覺化
DPtoLP / LPtoDP:裝置↔邏輯座標互轉(點、矩形、大小)。GetDeviceCaps(LOGPIXELSX/Y):取得裝置每邏輯吋像素數(通常 96 DPI)。void CMyView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
if (pInfo->m_bPrinting)
{
pDC->SetMapMode(MM_TWIPS); // 列印統一用 TWIPS
pDC->SetWindowExt(1440, 1440); // 1 twip = 1/1440 吋
pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),
-pDC->GetDeviceCaps(LOGPIXELSY));
}
else
{
pDC->SetMapMode(MM_TEXT); // 螢幕用像素
}
CView::OnPrepareDC(pDC, pInfo);
}
MM_ANISOTROPIC 必須成對設定 WindowExt 與 ViewportExt,否則比例未定義。MM_TEXT Y 向下增,繪製矩形時 top > bottom 會畫不出來。OnPrepareDC 區分列印/螢幕設定映射模式。DPtoLP。掌握映射模式,即可編寫「所見即所得」的跨裝置繪圖程式,從螢幕到紙張完美呈現設計尺寸。