设为首页
加入收藏
发布文章
  首页   操作系统   系统集成   程序设计   网站设计   图形图象   安全技术   反击技术   硬件DIY   认证考试   免费资源
当前位置:中国E盟 -=> 硬件 DIY -=> 数码设备 -=> 正文  
VC打印实践浅谈 << 轻松让你的摄像头变成文字扫描器 | 巧用FileSystem组件实现WEB应用中的本地特定打印 (转) >> 
 发布日期:2006-5-27 11:25:30 发布者:[未知]  来源:[本站]  浏览:[]  评论:[ 字体:   

在做打印模块时,经常会出于不同的目的改变打印机的默认配置。对于打印机配置最重要的一个结构就是DEVMODE结构(结构的具体构成请MSDN),该结构中几乎包含了打印机的所有配置信息。下面将给出几个经常要用到的配置项的实现。

PRINTDLG pd; //该结构包含打印对话框中的所有信息
LPDEVMODE lpDevMode;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd)) //获得默认的打印机的信息
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
if(lpDevMode)
{
lpDevMode->dmPaperSize=DMPAPER_A4; //将打印纸设置为A4
lpDevMode->dmOrientation=DMORIENT_LANDSCAPE; //将打印机设置为横向打印。
lpDevMode->dmPrintQuality=600 //打印分辨率为600dpi
}
GlobalUnlock(pd.hDevMode);
}

其实,看看MSDN中DEVMODE结构的文档,套用上面这个模式,你就可以随便配置你的打印机了。如果你想配置完成后,还为用户显示打印对话框的话。可以将pd替换为printDlg.m_pd,当然你要事先定义printDlg。实现语言为“CPrintDialog printDlg(FALSE);”。

下面要讲的内容才是我要写本文的初衷,这是我刚刚解决的问题,在网上贴帖子没有人能回答的出,所以将它写出来同各位朋友共享。

我写的打印程序,在我的机器上打印正常,可是到了某些机器上打印就不正常了,打印的字体比我的大,整个版面都乱了。这下我可给搞糊涂了,同是一台打印机,程序中我也设置了映射模式为MM_TEXT,怎么可能出现这种情况呢?后来同事发现了问题的所在,因为打印时采用的分辨率不同。由于我们不同的机器上装的是不同版本的打印驱动程序,他们默认的打印分辨率也不相同。我的机器上的打印驱动默认的是1200dpi的分辨率,而出问题的打印机的分辨率为600dpi。所以打出来的字体比原来大了两倍。下面我来分析一下原因:
WINDOWS中的字体的高度,宽度是用逻辑单元(Logical units)来表示的,逻辑单元本身并不是一种长度单位。但字体可以通过它按照一定的映射模式,经过计算后显示在不同的设备终端上。比如:有一个高为240个逻辑单元的字体,系统的映射模式为MM_TEXT(即一个逻辑单元对应一个设备像素),那么字体在屏幕的输出为240个像素高,如果换为其他的映射模式那么它就会在屏幕输出不同的大小。如果我们改变了显示器的分辨率,将它的分辨率调高,相应的每个像素大小就会变小。那么再按照MM_TEXT映射模式,将字体显示在显示器上,那么此时字体也会比刚才看着小。

同样,这中情况也适于打印机,打印机的设备像素是点。1200dpi表示打印机每英寸可以打1200个点。600dpi表示每英寸可以打600个点。显然对于任何字体,在分辨率为600dpi的打印机上打印的大小是在1200dpi分辨率打印机上打印大小的两倍。所以为了处理这个问题我设置了一个打印系数,对于所有的打印排版所用的
参数都乘以这个系数,这样问题就迎刃而解了。下面是得到打印系数的实现:

#define PRINT_DPI_DEFAULT 1200 //我调好的程序分辨率为1200dpi
m_fXCoefficient=1;//初始化打印系数

PRINTDLG pd;
LPDEVMODE lpDevMode;
double fXDPI=PRINT_DPI_DEFAULT; //

CPrintDialog printDlg(FALSE);

if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
if(lpDevMode)
{
lpDevMode->dmPaperSize=DMPAPER_A4;
}
GlobalUnlock(pd.hDevMode);
}

printDlg.m_pd.hDevMode=pd.hDevMode;

if (printDlg.DoModal() == IDCANCEL)
return;

fXDPI=(double)lpDevMode->dmPrintQuality;
if(fXDPI>0)
{
m_fXCoefficient=fXDPI/PRINT_DPI_DEFAULT;
}

唉!本人汉语能力有限,只能写成这样了,望各位朋友不要见怪!!!

]]>
打印 】【 收藏 】【 推荐 】 
相关文章 推荐文章 热门文章
·暂无  ·暂无
典型U盘故障解决
VC打印实践浅谈
高手教你维护液晶显示器五行宝典
轻松让你的摄像头变成文字扫描器
谈摄像头选购
 评一评
正在读取…
  笔名:
  评论:
   
【注】 发表评论必需遵守以下条例:
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款

设置首页 - 加入收藏 - 关于我们 - 联系我们 - 友情连接 - -

Copyright ©2006-2008 中国E盟 Powered By:www.chinaE.org

湘ICP备05004075号