熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

不同映射模式下的直線輸出的效果問題[1]

2022-06-13   來源: .NET編程 

  在做打印預覽時發現有趣的現象

  打印預覽時寬度設置為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了

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/14847.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.