概念:
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表示是沿宽度上的像素数。