Windows程序设计TXT13.使用打印机

上传人:人*** 文档编号:505387747 上传时间:2023-02-14 格式:DOC 页数:63 大小:396.50KB
返回 下载 相关 举报
Windows程序设计TXT13.使用打印机_第1页
第1页 / 共63页
Windows程序设计TXT13.使用打印机_第2页
第2页 / 共63页
Windows程序设计TXT13.使用打印机_第3页
第3页 / 共63页
Windows程序设计TXT13.使用打印机_第4页
第4页 / 共63页
Windows程序设计TXT13.使用打印机_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《Windows程序设计TXT13.使用打印机》由会员分享,可在线阅读,更多相关《Windows程序设计TXT13.使用打印机(63页珍藏版)》请在金锄头文库上搜索。

1、使用打印机 壹佰软件开发小组 整理编译 -为了处理文字和图形而使用视讯显示器时,设备无关的概念看来非常完美,但对于打印机,设备无关的概念又怎样呢?总的说来,效果也很好。在Windows程序中,用于视讯显示器的GDI函数一样可以在印表纸上打印文字和图形,在以前讨论的与设备无关的许多问题(多数都与平面显示的尺寸、分辨率以及颜色数有关)都可以用相同的方法解决。当然,一台打印机不像使用阴极射线管的显示器那么简单,它们使用的是印表纸。它们之间有一些比较大的差异。例如,我们从来不必考虑视讯显示器没有与显示卡连结好,或者显示器出现屏幕空间不够的错误,但打印机off line和缺纸却是经常会遇到的问题。我们也

2、不必担心显示卡不能执行某些图形操作,更不用担心显示卡能否处理图形,因为,如果它不能处理图形,就根本不能使用Windows。但有些打印机不能打印图形(尽管它们能在Windows环境中使用)。绘图机尽管可以打印向量图形,却存在位图块的传输问题。以下是其它一些需要考虑的问题:打印机比视讯显示器慢。尽管我们没有机会将程序性能调整到最佳状态,却不必担心视讯显示器更新所需的时间。然而,没有人想在做其它工作前一直等待打印机完成打印任务。 程序可以用新的输出覆盖原有的显示输出,以重新使用视讯显示器表面。这对打印机是不可能的,打印机只能用完一整页纸,然后在新一页的纸上打印新的内容。 在视讯显示器上,不同的应用程

3、序都被窗口化。而对于打印机,不同应用程序的输出必须分成不同的文件或打印作业。 为了在GDI的其余部分中加入打印机支持功能,Windows提供几个只用于打印机的函数。这些限用在打印机上的函数(StartDoc、EndDoc、StartPage和EndPage)负责将打印机的输出组织打印到纸页上。而一个程序呼叫普通的GDI函数在一张纸上显示文字和图形,和在屏幕上显示的方式一样。在第十五、十七和十八章有打印位图、格式化的文字以及metafile的其它信息。打印入门当您在Windows下使用打印机时,实际上启动了一个包含GDI32动态链接库模块、打印驱动程序动态连结模块(带.DRV扩展名)、Windo

4、ws后台打印程序,以及有用到的其它相关模块。在写打印机打印程序之前,让我们先看一看这个程序是如何进行的。打印和背景处理当应用程序要使用打印机时,它首先使用CreateDC或PrintDlg来取得指向打印机设备内容的句柄,于是使得打印机设备驱动程序动态链接库模块被加载到内存(如果还没有加载内存的话)并自己进行初始化。然后,程序呼叫StartDoc函数,通知说一个新文件开始了。StartDoc函数是由GDI模块来处理的,GDI模块呼叫打印机设备驱动程序中的Control函数告诉设备驱动程序准备进行打印。打印一个文件的程序以StartDoc呼叫开始,以EndDoc呼叫结束。这两个呼叫对于在文件页面上

5、书写文字或者绘制图形的GDI命令来说,其作用就像分隔页面的书挡一样。每页本身是这样来划清界限的:呼叫StartPage来开始一页,呼叫EndPage来结束该页。例如,如果应用程序想在一页纸上画出一个椭圆,它首先呼叫StartDoc开始打印任务,然后再呼叫StartPage通知这是新的一页,接着呼叫Ellipse,正如同在屏幕上画一个椭圆一样。GDI模块通常将程序对打印机设备内容做出的GDI呼叫储存在磁盘上的metafile中,该文件名以字符串EMF(代表增强型metafile)开始,且以.TMP为扩展名。然而,我在这里应该指出,打印机驱动程序可能会跳过这一步骤。当绘制第一页的GDI呼叫结束时,

6、应用程序呼叫EndPage。现在,真正的工作开始了。打印机驱动程序必须把存放在metafile中的各种绘图命令翻译成打印机输出数据。绘制一页图形所需的打印机输出数据量可能非常大,特别是当打印机没有高级页面制作语言时,更是如此。例如,一台每英寸600点且使用8.511英寸印表纸的激光打印机,如果要定义一个图形页,可能需要4百万以上字节的数据。为此,打印机驱动程序经常使用一种称作打印分带的技术将一页分成若干称为输出带的矩形。GDI模块从打印机驱动程序取得每个输出带的大小,然后设定一个与目前要处理的输出带相等的剪裁区,并为metafile中的每个绘图函数呼叫打印机设备驱动程序的Output函数,这个

7、程序叫做将metafile输出到设备驱动程序。对设备驱动程序所定义的页面上的每个输出带,GDI模块必须将整个metafile输出到设备驱动程序。这个程序完成以后,该metafile就可以删除了。对每个输出带,设备驱动程序将这些绘图函数转换为在打印机上打印这些图形所需要的输出数据。这种输出数据的格式是依照打印机的特性而异的。对点阵打印机,它将是包括图形序列在内的一系列控制命令序列的集合(打印机驱动程序也能呼叫在GDI模块中的各种helper辅助例程,用来协助这种输出的构造)。对于带有高阶页面制作语言(如PostScript)的激光打印机,打印机将用这种语言进行输出。打印驱动程序将打印输出的每个输

8、出带传送到GDI模块。随后,GDI模块将该打印输出存入另一个临时文件中,该临时文件名以字符串SPL开始,带有.TMP扩展名。当处理好整页之后,GDI模块对后台打印程序进行一个程序间呼叫,通知它一个新的打印页已经准备好了。然后,应用程序就转向处理下一页。当应用程序处理完所有要打印的输出页后,它就呼叫EndDoc发出一个信号,表示打印作业已经完成。图13-1显示了应用程序、GDI模块和打印驱动程序的交互作用程序。图13-1 应用程序、GDI模块、打印驱动程序和打印队列程序的交互作用过程 Windows后台打印程序实际上是几个组件的一种组合(见表13-1)。表13-1 打印队列程序组件 说明 打印请

9、求队列程序 将数据流传递给打印功能提供者 本地打印功能提供者 为本地打印机建立背景文件 网络打印功能提供者 为网络打印机建立背景文件 打印处理程序 将打印队列中与设备无关的数据转换为针对目的打印机的格式 打印端口监视程序 控件连结打印机的端口 打印语言监视程序 控件可以双向通讯的打印机,设定设备设定并检测打印机状态 打印队列程序可以减轻应用程序的打印负担。Windows在启动时就加载打印队列程序,因此,当应用程序开始打印时,它已经是活动的了。当程序行印一个文件时,GDI模块会建立包含打印输出数据的文件。后台打印程序的任务是将这些文件发往打印机。GDI模块发出一个消息来通知它一个新的打印作业开始

10、,然后它开始读文件并将文件直接传送到打印机。为了传送这些文件,打印队列程序依照打印机所连结的并列端口或串行埠使用各种不同的通信函数。在打印队列程序向打印机发送文件的操作完成后,它就将包含输出数据的临时文件删除。这个交互作用过程如图13-2所示。图13-2 后台打印程序的操作程序 这个程序的大部分对应用程序来说是透明的。从应用程序的角度来看,打印只发生在GDI模块将所有打印输出数据储存到磁盘文件中的时候,在这之后(如果打印是由第二个线程来操作的,甚至可以在这之前)应用程序可以自由地进行其它操作。真正的文件打印操作成了后台打印程序的任务,而不是应用程序的任务。通过打印机文件夹,使用者可以暂停打印作

11、业、改变作业的优先级或取消打印作业。这种管理方式使应用程序能更快地将打印数据以实时方式打印,况且这样必须等到打印完一页后才能处理下一页。我们已经描述了一般的打印原理,但还有一些例外情况。其中之一是Windows程序要使用打印机时,并非一定需要后台打印程序。使用者可以在打印机属性表格的详细数据属性页中关闭打印机的背景操作。为什么使用者希望不使用背景操作呢?因为使用者可能使用了比Windows打印队列程序更快的硬件或软件后台打印程序,也可能是打印机在一个自身带有打印队列器的网络上使用。一般的规则是,使用一个打印队列程序比使用两个打印队列程序更快。去掉Windows后台打印程序可以加快打印速度,因为

12、打印输出数据不必储存在硬盘上,而可以直接输出到打印机,并被外部的硬件打印队列器或软件的后台打印程序所接收。如果没有启用Windows打印队列程序,GDI模块就不把来自设备驱动程序的打印输出数据存入文件中,而是将这些输出数据直接输出到打印输出埠。与打印队列程序进行的打印不同,GDI进行的打印一定会让应用程序暂停执行一段时间(特别是进行打印中的程序)直到打印完成。还有另一个例外。通常,GDI模块将定义一页所需的所有函数存入一个增强型metafile中,然后替驱动程序定义的每个打印输出带输出一遍该metafile到打印驱动程序中。然而,如果打印驱动程序不需要打印分带的话,就不会建立这个metafile;GDI只需简单地将绘图函数直接送往驱动程序。进一步的变化是,应用程序也可能得承担起对打印输出数据进行打印分带的责任,这就使得应用程序中的打印程序代码更加复杂了,但却免去了GDI模块建立metafile的麻烦。这样,GDI只需简单地为每个输出带将函数传到打印驱动程序。或许您现在已经发现了从一个Windows应用程序进行打印操作要比使用视讯显示器的负担更大,这样可能出现一些问题特别是,如果GDI模块在建立metafile或打印输出文件时耗尽了磁盘空间。您可以更关切这些问题,并尝试着处理这些问题并告知使用者,或者您当然也可以置之不理。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号