映射模式

概念:

 

1.逻辑坐标

逻辑坐标是独立于设备的,它与设备点的大小无关。使用逻辑单位,是实现"所见即所得"的基础。当程序员在调用一个画线的GDI函数LineTo,画出25.4mm(1英寸) 长的线时,他并不需要考虑输出的是何种设备。若设备是VGA显示器,Windows自动将其转化为96个像素点;若设备是一个300dpi的激光打印机,Windows自动将其转化为300个像素点。

 

2.设备坐标

Windows将GDI函数中指定的逻辑坐标映射为设备坐标,在所有的设备坐标系统中,单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。

 

3.窗口

"窗口"依赖于逻辑坐标,可以是像素点、毫米或程序员想要的其他尺度。

 

4.视口

"视口"依赖于设备坐标(像素点)。

 

5.映射模式

所谓映射模式,其实就是“窗口”坐标值与“视口”坐标值的换算标准。其实很像现实中的汇率。

 

还有一种非常好的理解方式。同样一张纸(比如一张A4纸),然后用两种单位来比划这张纸,例如用英寸和厘米,或是你自己定义一个单位。假如我们用像素丈量一张纸,有100*200像素大小,但是你说“我不用你的单位,我说它是4000*8000XX单位”。那(XX单位)跟像素的换算就是4000XX单位 = 100像素,那1XX单位 = 100/4000 = 0.025像素。XX单位就是逻辑单位。像素是设备单位。

可以建立下面的对应:

逻辑单位 ---------XX单位

设备单位 ---------像素

窗口       ---------用XX单位为单位描述的纸

视口       ---------用像素为单位描述的同样大小的纸

 

 

理解:

 

举个例子:

如果你设定映射模式为:MM_LOENGLISH(代码为:SetMapMode(hDC, MM_LOENGLISH);),那窗口中的逻辑单位就为-“0.01物理英寸”。

那么你调用CDC::MoveTo(int,int)函数时,那么移动的单位(Unit)就是0.01物理英寸。 

那么总结为:1逻辑单位(MM_LOENGLISH映射模式下的单位) = 0.254mm = 0.01物理英寸

 

那么假如我在映射模式(MM_LOENGLISH)下,画了一个100逻辑单位的线,那么体现在现实世界中为1物理英寸。

 

那么设备如何显示这条1物理英寸长的线的呢,初想起来很简单,画个1物理英寸的线不就行了。但是你要的知道,显示设备(如显示器),是以像素为单位的,显然我们还要建立逻辑单位(窗口)与像素单位(视口)之间的换算关系。这种换算是Windows自动完成的,值的大小与设备的解析度有关系。如显示器,要表示1物理英寸的话,在800×600,与1024*768的两种解析度下,显然是不同的。再如打印机,300DPI(300点每英寸),与600DPI的打印机,显然也是不一样的。

 

逻辑英寸

我们用CDC::GetDeviceCaps(LOGPIXELSX)取得每逻辑英寸的像素数,LOGPIXELSX中的X表示是沿宽度上的像素数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值