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

《VC++ 技術內幕》學習筆記(六):映射模式詳解——從裝置座標到邏輯座標的轉換藝術

     編輯:VC 教學

為何需要映射模式?

預設 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 負值因向上增
}

可變比例模式:MM_ISOTROPIC / MM_ANISOTROPIC

需呼叫 SetWindowExt (邏輯範圍) 與 SetViewportExt (裝置範圍) 定義比例。

等比例範例 (MM_ISOTROPIC)

pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(1000, 1000);           // 邏輯 1000x1000
pDC->SetViewportExt(500, -500);          // 裝置 500x500 像素,Y 翻轉
// 邏輯 (100,100) 對應裝置 (50,-50),比例 1:0.5 等比例

非等比例範例 (MM_ANISOTROPIC)

pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000, 2000);           // 邏輯寬:高 = 1:2
pDC->SetViewportExt(400, -300);          // 裝置寬:高 = 4:3
// X 比例 0.4, Y 比例 0.15,圖形會被拉伸

原點平移:SetWindowOrg / SetViewportOrg

// 將邏輯原點 (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);
}

常見錯誤與避坑指南

  • 忘記設定 ViewportExt:MM_ANISOTROPIC 必須成對設定 WindowExt 與 ViewportExt,否則比例未定義。
  • Y 軸方向混淆:固定比例模式 Y 向上增,MM_TEXT Y 向下增,繪製矩形時 top > bottom 會畫不出來。
  • 列印縮放錯誤:印表機 DPI 遠高於螢幕,務必在 OnPrepareDC 區分列印/螢幕設定映射模式。
  • 座標轉換遺漏:滑鼠座標為裝置座標,繪圖邏輯座標前必須 DPtoLP。

掌握映射模式,即可編寫「所見即所得」的跨裝置繪圖程式,從螢幕到紙張完美呈現設計尺寸。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved