映射模式和转换

下表介绍了映射模式。

映射模式 说明
MM_ANISOTROPIC 页面空间中的每个单元都映射到设备空间中的应用程序指定的单元。 轴可能缩放,也可能不是均匀缩放 (例如,在世界空间中绘制的圆圈在给定设备上绘制时可能显示为椭圆) 。 轴的方向也由应用程序指定。
MM_HIENGLISH 页面空间中的每个单元映射到设备空间中的 0.001 英寸。 x 的值从左到右递增。 y 的值从下到上增加。
MM_HIMETRIC 页面空间中的每个单元映射到设备空间中的 0.01 毫米。 x 的值从左到右递增。 y 的值从下到上增加。
MM_ISOTROPIC 页面空间中的每个单元都映射到设备空间中的应用程序定义的单元。 轴始终是均匀缩放的。 轴的方向可由应用程序指定。
MM_LOENGLISH 页面空间中的每个单元映射到设备空间中的 0.01 英寸。 x 的值从左到右递增。 y 的值从下到上增加。
MM_LOMETRIC 页面空间中的每个单元映射到设备空间中的 0.1 毫米。 x 的值从左到右递增。 y 的值从下到上增加。
MM_TEXT 页面空间中的每个单元映射到一个像素;也就是说,根本不执行任何缩放。 如果没有转换生效 (这是默认) ,则MM_TEXT映射模式下的页面空间相当于物理设备空间。 x 的值从左到右递增。 y 的值从上到下递增。
MM_TWIPS 页面空间中的每个单位映射到打印机点的二十分之一 (1/1440 英寸) 。 x 的值从左到右递增。 y 的值从下到上增加。

 

若要设置映射模式,请调用 SetMapMode 函数。 通过调用 GetMapMode 函数检索 DC 的当前映射模式。

页面空间到设备空间转换由窗口和视区给定的点计算的值组成。 在此上下文中,窗口引用页面空间的逻辑坐标系,而视区是指设备空间的设备坐标系。 每个窗口和视区都由原点、水平 (“x”) 范围和垂直 (“y”) 范围) 组成。 窗口参数位于逻辑坐标中;设备中的视区 (像素) 坐标。 系统将窗口和视区中的原点和范围组合在一起,以创建转换。 这意味着窗口和视区各自指定定义用于将页面空间中的点映射到设备空间的转换所需的一半因素。 因此,系统将窗口原点映射到视区原点,将窗口范围映射到视区范围,如下图所示。

显示页面空间中的窗口原点和设备空间中的视点原点的插图

窗口和视区区建立页面空间到设备空间转换中使用的比率或缩放因子。 对于 (MM_HIENGLISH、MM_LOENGLISH、MM_HIMETRIC、MM_LOMETRIC、MM_TEXT和MM_TWIPS) 的六种预定义映射模式,盘区在调用 SetMapMode 时由系统设置。 无法更改它们。 (MM_ISOTROPIC和MM_ANISOTROPIC) 的其他两种映射模式需要指定盘区。 为此,调用 SetMapMode 以设置适当的模式,然后调用 SetWindowExtEx 和SetViewportExtExtEx 函数来指定盘区。 在MM_ISOTROPIC映射模式下,在调用 SetViewportExtEx 之前 调用 SetWindowExtEx 非常重要。

窗口和视区原点建立页面空间到设备空间转换中使用的转换。 使用 SetWindowOrgExSetViewportOrgEx 函数设置窗口和视区原点。 原点与盘区无关,应用程序可以设置它们,而不考虑当前映射模式。 更改映射模式不会影响当前设置的原点 (但可能会影响盘区) 。 原点以当前映射模式不影响的绝对单位指定。 若要更改原点,请使用 OffsetWindowOrgExOffsetViewportOrgEx 函数。

以下公式显示将点从页面空间转换为设备空间所涉及的数学运算。

Dx = ((Lx - WOx) * VEx / WEx) + VOx 

涉及以下变量。

Dx     x value in device units 
Lx     x value in logical units (also known as page space units) 
WOx     window x origin 
VOx     viewport x origin 
WEx     window x-extent 
VEx     viewport x-extent 

使用 y 替换 x 的相同公式可转换点的 y 分量。

公式首先将点从其坐标原点偏移。 此值不再被原点偏置,然后按盘区比率缩放到目标坐标系中。 最后,缩放值被目标原点偏移到其最终映射。

LPtoDPDPtoLP 函数可用于分别从逻辑点转换为设备点,以及从设备点转换为逻辑点。