GDI 繪圖使用「邏輯單位」,透過映射模式轉換為裝置單位(像素)。映射模式儲存於裝置環境(DC),GetMapMode/SetMapMode 存取。
xViewport = (xWindow - xWinOrg) * (xViewExt / xWinExt) + xViewOrg yViewport = (yWindow - yWinOrg) * (yViewExt / yWinExt) + yViewOrg
對應函數:LPtoDP、DPtoLP。
| 模式 | 邏輯單位 | X增 | Y增 |
|---|---|---|---|
| MM_TEXT | 像素 | 右 | 下 |
| MM_LOMETRIC | 0.1mm | 右 | 上 |
| MM_HIMETRIC | 0.01mm | 右 | 上 |
| MM_LOENGLISH | 0.254mm | 右 | 上 |
| MM_HIENGLISH | 0.0254mm | 右 | 上 |
| MM_TWIPS | 0.0176mm (1/1440吋) | 右 | 上 |
| MM_ISOTROPIC | 自訂 (X=Y) | 可選 | 可選 |
| MM_ANISOTROPIC | 自訂 (X≠Y) | 可選 | 可選 |
NT 上若直接用 MM_LOENGLISH 會導致物件顯示過小。須使用「邏輯英吋」:以 MM_ANISOTROPIC 搭配 SetWindowExt(100,100)、SetViewportExt(LOGPIXELSX, LOGPIXELSY)。各模式對應 SetWindowExt 參數見文中表二(如 MM_TWIPS 用 1440)。
當視窗/視口範圍比無法整除時,會產生像素誤差(未重繪、間距異常、大小抖動)。解決:
理解映射模式原理與轉換公式,配合適當的範圍設定,即可精確控制繪圖輸出,解決跨裝置顯示一致性問題。