VC打印实践浅谈

打印

经常看到VC论坛中一些朋友问关于打印的问题,好多是问过好多遍的,其实搜索一下原来的帖子可以找到好多,而且都是给了正确的解决方法的。但我搜了一下文档中心,发现好象关于一下我要讲的内容的还没有。所以我决定把自己在做程序时遇到的问题,及实现方法和心得体会写下来,重在交流。文中如有疏漏之处,请各位朋友及时指出,以免我落个误人误己的下场。

在做打印模块时,经常会出于不同的目的改变打印机的默认配置。对于打印机配置最重要的一个结构就是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;
}

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

时间: 2024-11-03 02:23:15

VC打印实践浅谈的相关文章

浅谈VC中的字节对齐

原文地址:浅谈VC中的字节对齐 前几天时,在公司和同事说到了字节对齐,一直对这个概念比较模糊,只是在<程序员面试宝典>中看到过简单的描述和一些面试题.后来在论坛中有看到有朋友在询问字节对齐的相关问题,自己也答不上来,觉得应该研究一下,所以就有了这一篇博文,是对学习的一个总结,也是对成长轨迹的一个记录.       字节对齐,又叫内存对齐,个人理解就是一种C++中的类型在内存中空间分配策略.每一种类型存储的起始地址,都要求是一个对齐模数(alignment modulus)的整数倍.问题来了,为

A5 SEO诊断浅谈电子书制作流程

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 现在推广方式越来越多,电子书也早已成为推广方式中的主流,越来越受到企业的重视,站长们也都纷纷学习如何制作电子书,更把电子书做为推广网站的主要手段,增加外链的有效方法.下面A5 SEO诊断优化小组就来和大家浅谈一下电子书的制作流程. 一.整理内容 内容先制作成Word文档,然后转换成pdf,如果有整理好的html文档可直接转换 制作word文档

东湖之声:浅谈武汉互联网的环境、创业、投资

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 时间:2009.7.5 14:30-16:30 地点:东湖边 参会人:mull,刘瑜, 叶凯华,赵红良,王金松,孟建兵,何铭 身份介绍: Mull:原[武汉5G评论]发起人 刘瑜:原[武汉互联网每周聚会台北路]发起人 叶凯华:[创友网]发起人 赵红良:武汉站长站站长(中国娃娃) 王金松:[超级天使投资网]发起人 孟建兵:[UFO天使投资网,创友网]发起人 何铭(主持人):掌智信息科技有限公司总经理 天公作美.武汉"东湖之声"第一次

浅谈document.write()输出样式

  这篇文章主要介绍了浅谈document.write()输出样式,十分的简单实用,有需要的小伙伴可以参考下. js中的最基本的命令之一:document.write(),用于简单的打印内容到页面上,可以逐字打印你需要的内容--document.write("content"),这里content就是需要输出的内容;当然还有一种情况,需要输出JS之中比如变量等等变化的东西,那么就需要用document.write(+variable);当然variable就是你想要输出的变量. 既然可

图标字体化浅谈[转]

在做手机端Web App项目中,经常会遇到小图标在手机上显示比较模糊的问题,经过实践发现了一种比较好的解决方案,图标字体化.在微社区项目中,有很多小的Icon(图 标),如分享.回复.赞.返回.话题.访问.箭头等,这些Icon(图标)一般都是纯色的.开始制作时考虑用双倍大小的Sprite图,通过CSS样式设 置只显示二分之一尺寸,这样在Retina屏上显示的大小是正常的,一旦放大屏幕后图标又变得模糊不清,测试的效果不是很理想,后来又考虑多套图标适配方 案.SVG矢量图等,都因为种种原因放弃掉了(

网站建设:浅谈颜色模式

浅谈颜色模式 你有没有这种感觉,一幅色彩生动亮丽的图象通过彩色喷墨打印机打印出来,颜色变得灰暗难看,尽管打印机是高质量输出?不过在你责备你的打印机之前,我想问一问,你的图象是什么颜色格式? "颜色就是颜色,还有什么格式?" 是的,颜色也存在着各种格式. 打开你的Photoshop,看看Image菜单下的Mode项,里面有一长串的名字,那些都是什么?让我们慢慢道来. RGB颜色模式 我们每天面对的显示器便是根据这种特性,由RGB组成颜色.这就是RGB颜色模式的基础. 显示器是通过发射三种

Java 学习方法浅谈

Java 学习方法浅谈 -------------------------------------------------------------------------------- Java本身是一种设计的非常简单,非常精巧的语言,所以Java背后的原理也很简单,归结起来就是两点: 1.JVM的内存管理 理解了这一点,所有和对象相关的问题统统都能解决 2.JVM Class Loader 理解了这一点,所有和Java相关的配置问题,包括各种App Server的配置,应用的发布问题统统都能解

浅谈百度外链对网站关键词排名的影响

浅谈百度外链对网站关键词排名的影响 建站的朋友都知道,网站优化无外乎内容,外部链接,关键词.而今天在这里要跟大家谈的是,外部链接跟关键词排名的关系.首先,我们需要知道,什么叫外部链接?外部链接,也叫反向链接,就是从外部网站指向自己网站的链接;查询外部链接数量可以用工具查询,也可以使用查询指令在搜索引擎查询.我们查询各大搜索引擎的反链,其目的也就是要对查询的结果进行分析,根据查询的结果分析出反链的存在形式: 1.超链接形式 这种反链可以是关键词链接,比如:广州尔码,也可以是网址链接;而关键词链接又

浅谈SEO优化的三大误区

seo需要的是我们亲自动手的能力,绝不是人云亦云,因为有一些道理不是随口说说就能够明白,在搜索引擎不断变化的今天,每一次的调整,都有人做总结;每一次的更新,都会有他的道理,现在无论在什么地方,关于seo的分析总是有很多,相信经常在seo论坛上和A5论坛上逛的朋友,总是可以看到很多理论派的seo文章,这些观点都认同吗,那么,这些分析之中,自己就浅谈下有哪些seo不同的观点吧. 一:seo外链和排名的关系,外链越多,排名越好吗? 每一位seo都知道外链的重要性,每天的工作任务之一就是发外链,每天的任