Windows映射模式及相关问题的解决
2010-07-15 20:45:35 来源:WEB开发网3.逻辑坐标与设备坐标的转换方式
映射方式定义了Windows如何将GDI函数中指定的逻辑坐标映射为设备坐标。要继续讨论映射方式我们要介绍Windows有关映射模式的一些术语:我们将逻辑坐标所在的坐标系称为"窗口",将设备坐标所在的坐标系称为"视口"。
"窗口"依赖于逻辑坐标,可以是像素点、毫米或程序员想要的其他尺度。
"视口"依赖于设备坐标(像素点)。通常,视口和客户区域等同。但是,如果程序员用GetWindowDC或CreateDC获取了一个设备环境,则视口也可以指全窗口坐标或屏幕坐标。点(0,0)是客户区域的左上角。x的值向右增加,y的值向上增加。
对于所有映射模式,Windows都用下面两个公式将窗口坐标转换成视口坐标:
xViewport=(xWindow-xWinOrg)*(xViewExt/xWinExt)+xViewOrg
yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg
其中,(xWindow,yWindows)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备点。如果设备坐标是客户区域坐标或全窗口坐标,则Windows在画一个对象前,还必须将这些坐标转换成屏幕坐标。
这两个公式使用了分别指定窗口和视口原点的点:(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视口原点。在缺省的设备环境中,这两个点均设置为(0,0),但它们可以改变。此公式意味着,逻辑点(xWinOrg,yWinOrg)总被映射为设备点(xViewOrg,yViewOrg)。
Windows还能将视口(设备)坐标转换为窗口(逻辑)坐标:
xWindow=(xViewport-xViewOrg)*(xWinExt/xViewExt)+xWinOrg
yWindow=(yViewport-yViewOrg)*(yWinExt/yViewExt)+yWinOrg
可以使用Windows提供的两个函数DPtoLP和LPtoDP在设备坐标及逻辑坐标之间互相转换。
4.映射模式的种类
Windows定义了表1所列出的8种映射方式。
上述映射模式中又可分成以下3类:
映 射 方 式 | 逻 辑 单 位 | X 轴 增 加 | Y 轴 增 加 | 毫 米 |
MM_TEXT | 像 素 点 | 右 | 下 | 与 设 备 有 关 |
MM_LOMETRIC | 0. 1mm | 右 | 上 | 0.1 |
MM_HIMETRIC | 0. 01mm | 右 | 上 | 0.01 |
MM_LOENGLISH | 0. 254mm | 右 | 上 | 0.254 |
MM_HIENGLISH | 0. 0254mm | 右 | 上 | 0.0254 |
MM_TWIPS | 0.0176mm | 右 | 上 | 0.0176 |
MM_ISOTROPIC | 任 意(x=y) | 可 选 | 可 选 | 可 设 |
MM_ANISOTROPIC | 任 意(x!=y) | 可 选 | 可 选 | 可 设 |
MM_TEXT映射模式这种映射模式被称为"文本"映射方式,不是因为它对 于文本最合适,而是轴的方向与读文本的方向一致。Windows提供了函数SetViewportOrg和SetWindowOrg 用来设置视口和窗口的原点。缺省的窗口原点和视口原点均为(0,0),可以改变;缺省的窗 口范围和视口范围均为(1,1),不可改变。
度量映射方式MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH和MM_TWIPS 将1个逻辑单位映射为固定的实际单位,其中1twip等于0.0176mm(1/1440英寸)。其他映射模式对应的物理单位参见表1。设置了映射模式以后,Windows自动设置了窗口及视口的范围,范围本身的值并不重要,但范围比是一个固定的值,对于MM_LOMETRIC,Windows计算范围比xViewExt/xWinExt=0.1mm中水平像素的点数。
自定义映射模式MM_ISOTROPIC和MM_ANISOTROPIC两种映射模式允许程序员设置自己的窗口和视口范围。MM_ISOTROPIC和MM_ANISOTROPIC的区别是所设置的x轴和y轴的的范围必须相同,而MM_ANISOTROPIC所设置的x轴和y轴的的范围可以不同。isotropi的意思是" 在所有方向相同",anisotropic的意思正相反。自定义映射模式中窗口和视口的原点和范围都可以改变,程序员可以设置自己需要的映射模式。函数SetWindowExt和SetViewportExt 用于改变窗口和视口的范围。下面的代码将1个逻辑单位映射成0.396mm(1/64英寸)。
SetMapMode(hDC,MM_ISOTROPIC);
SetWindowExt(64,64);
SetViewportExt(hdc,GetDeviceCaps(hdc,LOGPIXELSX),GetDeviceCaps(hdc, LOGPIXELSY));
更多精彩
赞助商链接