关于映射模式的解惑
Windows是所见即所得的,我以前一直有个疑惑,怎么将屏幕上实际显示的比如5厘米长的线,在打印机上也实际打印出来5厘米,其实这个问题就是映射模式.
在Windows下有几种映射模式:
所谓的映射模式就是将逻辑单位与物理单位的转换,使用SetMapMode函数.举个例子说:DrawLine(0,100),在默认情况下映射模式是MM_TEXT,那么DrawLine中的100就是100个像素,我们可以把这个"100"理解成"100"个单位,而这100单位在不同的模式下所代表的意义就不相同.在MM_TEXT下代表100个像素,但是在MM_LOMETRIC下就代表10mm.通过这些我就清楚了,如果想要在屏幕上画10mm的线且在打印机上也画10mm的线,那么就分别将窗口的DC和Printer的DC都通过SetMapMode设置成MM_LOMETRIC,这样二者代表的单位就一致了.
以前我也遇到过这样的问题:打印时没有设置任何的映射模式,在200Dpi的打印机下和300Dpi的打印机下如果DrawLine(100,0)的线,长度是不一样的,在300Dpi下的线要短于200Dpi下的,这又是为什么呢?这是因为,我们所说的XXXDpi的打印机,是指1英寸可以打印多少点,那么200Dpi的就是1英寸内打印200个点,换句话说,就是原来在200Dpi打印机上DrawLine的100单位的线,是0.5英寸,但是在300Dpi下是100/300,就是0.3英寸长.显示器默认的映射模式MM_TEXT是指像素,而打印机默认的MM_TEXT是指的"点,即Dpi".
作个示例:
|______________________| 200Dpi下的1英寸,横线部分代表有"200"个点
|______________________| 300Dpi下的1英寸,横线部分代表有"300"个点
那么在200Dpi下输出200个点,就是1英寸,但在300Dpi下输出200个点,则不足1英寸
另外,注意坐标系,不管是什么映射模式,左上角的坐标永远是(0,0),但除了MM_TEXT外,Y轴的正向在上向,负向在下方,这就意味着画图的时候,指定Y坐标是要使用负数,否则将会输出到指定DC的外部(因为正数在可显示范围外).
例如我在Delphi中画线要使用:
setmapmode(printer.Handle,MM_LOMETRIC);
printer.BeginDoc;
printer.Canvas.MoveTo(0,-100);
printer.Canvas.LineTo(1000,-100);
printer.EndDoc;