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

Windows 映射模式詳解與常見問題解決

     編輯:關於VC++

映射模式基礎

GDI 繪圖使用「邏輯單位」,透過映射模式轉換為裝置單位(像素)。映射模式儲存於裝置環境(DC),GetMapMode/SetMapMode 存取。

座標系統

  • 邏輯座標:裝置無關,支援「所見即所得」。
  • 裝置座標:以像素為單位,分為客戶區、螢幕、整個視窗三種。

座標轉換公式

xViewport = (xWindow - xWinOrg) * (xViewExt / xWinExt) + xViewOrg
yViewport = (yWindow - yWinOrg) * (yViewExt / yWinExt) + yViewOrg

對應函數:LPtoDP、DPtoLP。

八種標準映射模式

模式邏輯單位X增Y增
MM_TEXT像素右下
MM_LOMETRIC0.1mm右上
MM_HIMETRIC0.01mm右上
MM_LOENGLISH0.254mm右上
MM_HIENGLISH0.0254mm右上
MM_TWIPS0.0176mm (1/1440吋)右上
MM_ISOTROPIC自訂 (X=Y)可選可選
MM_ANISOTROPIC自訂 (X≠Y)可選可選

常見問題與解決

1. OLE Server 映射模式設定

NT 上若直接用 MM_LOENGLISH 會導致物件顯示過小。須使用「邏輯英吋」:以 MM_ANISOTROPIC 搭配 SetWindowExt(100,100)、SetViewportExt(LOGPIXELSX, LOGPIXELSY)。各模式對應 SetWindowExt 參數見文中表二(如 MM_TWIPS 用 1440)。

2. 座標轉換誤差處理

當視窗/視口範圍比無法整除時,會產生像素誤差(未重繪、間距異常、大小抖動)。解決:

  1. 優先選擇可整除的模式(如 MM_TWIPS:1440/96 = 15/1,零誤差)。
  2. 不可整除時化簡分數(如 64/96 → 2/3),邏輯座標取分子倍數、裝置座標取分母倍數,即可消除精度損失。

結語

理解映射模式原理與轉換公式,配合適當的範圍設定,即可精確控制繪圖輸出,解決跨裝置顯示一致性問題。

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