映射模式是设备描述表的内容之一,其优点是程序员可不必考虑输出设备的坐标系情况,而在一个统一的逻辑坐标系中组成图形的绘制与操作,映射模式定义了将逻辑单位转化为设备的度量单位以及设备的 x 方向和 y 方向。 Windows 中的映射模式如表 4-3 所示。

表4-3   Windows中的映像模式

映像模式

将一个逻辑单位映射为

坐标系设定

MM_ANISOTROPIC

系统确定

Optional

MM_HIENGLISH

0.001英寸

Y上,X右

MM_HIMETRIC

0.01毫米

Y上,X右

MM_ISOTROPIC

系统确定

Optional,但x轴和y轴的单位此例为1: 1

MM_LOENGLISH

0.01英寸

Y上,X右

MM_LOMETRIC

0.1毫米

Y上,X右

MM_TEXT

一个像素

Y下,X右

MM_TWIPS

1/1440英寸

Y上,X右

 

       映像模式对应用程序是很重要的。上述的映像模式中,MM_TEXT映像模式得到了普遍的应用,是缺省的映射模式

    MM_ANISOTROPIC和MM_ISOTROPIC这两种模式通过将图形从程序员定义的逻辑坐标窗口映射到物理设备的视口以实现坐标转换。窗口是对应逻辑坐标系上程序员设定的一个区域,视口是对应于实际输出设备上程序员设定的一个区域。换言之,如果程序员设定的映射模式为MM_ANISOTROPIC和MM_ISOTROPIC,则只需确定一个以逻辑坐标系为基础的窗口和一个以物理设备坐标系为基础的视口,Windows系统即可按照窗口和视口的坐标比例自动调整图形。

这两种映射模式的不同是MM_ISOTROPIC模式要求将窗口中的对称图形映射到视口时仍为对称图形,这种要求可能导致系统强制变换视口。而MM_ANISOTROPIC模式则完全按照窗口和视口的坐标比例进行映射。

(1)坐标系统

在Windows应用程序中有好几种坐标系统,它们大致可以分为两大类:设备坐标系统和逻辑坐标系统。

在设备坐标系统中又有三种相互独立的坐标系统:屏幕坐标系统、窗口坐标系统和用户区坐标系统。这些设备坐标系统均以像素点来表示度量的单位。x轴的正方向为从左到右,y轴的正方向为从上向下。注意,改变像素点数只是改变相关的视频模式,而改变度量单位将改变相关的设备描述表。

对于屏幕坐标系统:屏幕坐标系统使用整个屏幕坐标区作为坐标系统的原点。

对于窗口坐标系统:窗口坐标系统使用了边界在内的应用程序的窗口作为坐标区域。窗口边界的左上角是坐标系的原点。

对于用户区坐标系统:用户区坐标系统是最经常使用的坐标系统。用户区是窗口工作区,不包括窗口边界、菜单条及滚动条等。用户一般只操作应用程序的用户区,因此用户区坐标系统对大多数应用程序都是适用的。

其他的坐标系统都是逻辑坐标系统。其中映像模式规定了GDI函数中定义的逻辑单位如何转化为设备坐标。在画一个对象以前,Windows操作系统会把这些逻辑单位翻译成相应的设备坐标系统中的单位。

(2)映射模式的设置

    应用程序可获取设备环境的当前映射模式,并可根据需要设置映射模式。相关的函数为SetMapMode和GetMapMode。调用设置映射模式函数SetMapMode可设置设备环境的映射模式,其形式为:

SetMapMode(hdc,nMapMode);   //nMapMode为映射模式的整型标识符。
    调用GetMapMode函数可获取当前设备环境的映射模式,其形式为:
nMapMode=GetMapMode(hdc);
窗口区域的定义由Set WindowExtEx函数完成,其函数原形为:
 
BOOL Set WindowExtEx
(
HDC hdc,           
int nHeight,       //nHeight为以逻辑单位表示的新窗口区域高度
int nWidth,        //nWidth为以逻辑单位表示的新窗口区域宽度
LPSIZE lpSize      // lpSize为保存函数调用前窗口区域尺寸的SIZE结构地址,
//如果取NULL,则表示忽略调用前的尺寸
);
 
视口区域的定义由Set WindowExtEx函数完成,其函数原形为:
 
BOOL Set ViewportExtEx
(
HDC hdc,      
int nHeight,       //nHeight为以物理设备单位表示的新视口区域高度
int nWidth,        //nWidth为以物理设备单位表示的新视口区域宽度
LPSIZE lpSize      // lpSize:为保存函数调用前视口区域尺寸的SIZE结构地址,
//如果取NULL,则表示忽略调用前的尺寸
);
 
视口的缺省原点和窗口的缺省原点均为(0,0)。可通过调用函数SetViewportOrgEx和SetWindowOrgEx设定窗口与视口的原点。
SetWindoworgEx函数的原形为:
      BOOL SetWindowOrgEx
(
HDC hdc,
int X,             //X和Y为以逻辑单位表示的新窗口原点坐标
int Y,
LPPOINT lpPoint    //lpPoint为保存函数调用前原点坐标的POINT结构的地址,
//取NULL,则忽略调用前的尺寸。
);

 

其中SetWindowOrgEx函数和SetViewportOrgEx函数只有在映射模式为MM_ANISOTROPIC和MM_ISOTROPIC时才有意义。

在建立了窗口、视口以及映射模式的概念后,我们就可以在窗口上绘制相应的图形了,在绘制图形之前,我们还必须选择绘图工具如画笔或画刷以及它们的颜色属性等。