电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

不同映射模式下的直线输出的效果问题[1]


发布日期:2022/4/20
 

在做打印预览时发现有趣的现象

打印预览时宽度设置为mm的线与设置为mm的线显示效果一样无区别打印机输出正常

打印预览时相同宽度的线有些显示有些不显示 打印机输出正常

仔细查看了一下实际上是映射模式下的显示问题鑒于映射模式总是让人焦头烂额值得总结一下

开始分析

第一步写一个MM_TEXT模式的例子打印条竖线宽度由递增

dcSetMapMode(MM_TEXT);

for(int ii=;ii<=;ii++)

{

CPen pen;

penCreatePen(PS_SOLIDiiRGB());

CPen *pOldPen = dcSelectObject(&pen);

dcMoveTo(xStart+xInterval*ii);

dcLineTo(xStart+xInterval*iixLineLen);

dcSelectObject(&pOldPen);

}

当然会输出不同宽度的条线很正常映射模式是像素为单位

第二步模拟一下打印预览下的模式(mm的方式)

long lLogInch = ;

dcSetMapMode(MM_ANISOTROPIC);

dcSetWindowExt(lLogInch lLogInch);

dcSetViewportExt(dcGetDeviceCaps(LOGPIXELSX) dcGetDeviceCaps(LOGPIXELSY));

映射个单位是mm 同样用上面的代码输出线一样粗线一样粗 实际打印机输出粗细是递增的非常正常 Why?

第三步估计是精度问题吧?看看新的映射模式下每根线的实际输出像素首先通过long lX = dcGetDeviceCaps(LOGPIXELSX);取得当前显示器一个英寸是等于个像素

算一下

毫米 ——》/ =

毫米 ——》

毫米 ——》

毫米 ——》

毫米 ——》

毫米 ——》

很好解释了四捨五入后都是像素都是像素实际打印机呢? lX = 不用计算了吧精度高打印出来当然就OK了

[] []

上一篇:9.1.1 Common Language Runtime类型

下一篇:不同映射模式下的直线输出的效果问题[2]