首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

MFC 座標映射模式:從 MM_TEXT 到 MM_ANISOTROPIC 完整解析

     編輯:關於C語言

映射模式決定邏輯座標如何轉換為裝置座標(像素)。預設 `MM_TEXT`(X 右增、Y 下增、1 邏輯單位 = 1 像素)適合螢幕,但列印時圖形會變極小。使用公制/英制映射模式或自訂 `MM_ANISOTROPIC`,可實現螢幕與列印「所見即所得」的尺寸一致性。

預定義映射模式對照表

模式單位換算X 方向Y 方向原點
MM_TEXT1 像素右增下增左上
MM_HIENGLISH0.001 英吋右增上增左上
MM_HIMETRIC0.01 公釐右增上增左上
MM_LOENGLISH0.01 英吋右增上增左上
MM_LOMETRIC0.1 公釐右增上增左上
MM_TWIPS1/1440 英吋右增上增左上

除 `MM_TEXT` 外,Y 軸皆向上(符合數學慣例),繪圖時上方區域需用負座標。

自訂縱橫比:MM_ANISOTROPIC

需依序呼叫:

  1. `SetMapMode(MM_ANISOTROPIC)`
  2. `SetWindowExt(SIZE)`:設定邏輯單位範圍(視窗範圍)
  3. `SetViewportExt(SIZE)`:設定裝置單位範圍(視口範圍)

系統依「視窗範圍 / 視口範圍」比值計算縮放。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));
}

視口原點平移:SetViewportOrg

`CPoint SetViewportOrg(POINT pt)` 將邏輯原點 (0,0) 移至裝置座標 `pt`。例如 `SetViewportOrg(20,20)` 後,原邏輯 (0,0) 變為裝置 (-20,-20),繪圖整體右下偏移。

列印實務建議

  • 在 `OnPrepareDC` 中根據 `pDC->IsPrinting()` 切換映射模式
  • 使用 `MM_LOMETRIC` 或 `MM_TWIPS` 可直接以公制/英制單位繪圖,列印尺寸自動正確
  • 自訂 `MM_ANISOTROPIC` 時,視口範圍需根據 `GetDeviceCaps(LOGPIXELSX/Y)` 計算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved