您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Delphi 6集成开发环境05
第5章打印打印对于许多Windows程序员来说是十分棘手的问题。Delphi简化了打印时用户所必须了解的大部分内容。用户可以很轻松地写出简单的打印程序来输出文本和位图化了的图像。对于更为复杂的打印,仅需了解几个要领和技术,用户就可以实现任何类型的自定义打印。当了解了这些后,打印也就不那么困难了。Delphi的TPrinter对象封装了Windows的打印引擎,为程序员做了大量原本需要亲自做的工作。本章告诉用户怎样用TPrinter来完成各种打印作业。用户可以看到一个简单的例子,从中可以了解到创建高级打印程序的技术,而这些技术正是用户成为打印高手的起点。5.1TPrinter对象Delphi中的TPrinter类可以方便地实现通常的打印任务。通过Printer全局函数可以返回TPrinter类的一个对象,该对象在Printers单元中定义。可以把Printer全局函数看作一个全局变量,并利用这个全局变量来与打印机进行打印操作。利用Printer来实现打印的一般过程如下:(1)调用BeginDoc过程向打印机发送一个打印作业(此时还没有在打印机上开始打印)。(2)通过一个Text变量或调用Canvas对象方法建立打印输出。(3)调用EndDoc过程结束当前的打印作业,该打印作业开始在打印机上打印。(4)如果出现问题,调用Abort过程取消当前打印的作业。表5-1所示是TPrinter对象的几个常用属性:表5-1TPrinter对象的常用属性属性作用Aborted判断是否中止打印作业Canvas画布属性Capabilities当前打印机驱动设备的设置信息Copies打印的份数Fonts字体属性Handle打印机句柄Orientation纸张的方向:横向或纵向PageHeight纸张的高度PageNumber当前打印的页数PageWidth纸张的宽度Printers系统中安装的所有打印机Printing标识是否正在进行一个打印作业PrinterIndex打印机属性中当前打印机的索引值Title打印管理器中显示的打印作业的名称126第5章打印表5-2所示是TPrinter对象的几个常用方法表5-2TPrinter的方法方法作用Abort中止正在打印的打印作业BeginDoc向打印机发送一个打印作业EndDoc结束当前的打印作业并关闭文本文件变量GetPrinter获得当前打印机序号NewPage开始新的一页并增加PageNumber属性Refresh更新字体和打印机的属性通常,在打印前要进行打印预览。在打印预览的时候,往往要将打印的结果在屏幕上显示出来。这时,就要注意屏幕的分辨率和打印机的分辨率的差别了。读取屏幕信息可以通过全局变量Screen来实现,Screen为TScreen类的一个实例,在创建工程的时候就自动创建了,并在程序开始运行时读取了屏幕的一些设置信息。值得注意的一点是TPrinter.Canvas。TPrinter.Canvas对于窗体来说像一个画布,在它上面可以显示文本和图形。不同的是,TPrinter.Canvas表示的是打印输出的画布,而非显示用的画布。大多数用来显示文本、图像和画图的程序可以用同一种方式来打印输出。但是,在打印时必须考虑到其中的不同之处:¾在屏幕上绘画是动态的,可以擦去在屏幕上输出的内容。而向打印机中输出则不那么灵活,凡是向TPrinter.Canvas输出的内容将被打印机打印出来。¾在屏幕上显示文本和图是很快的,而向打印机输出,即使是高性能的激光打印机,也是较慢的。因此,必须允许用户能够终止打印作业或者采用其他办法来放弃打印作业。¾由于用户运行的是Windows,可以假定支持图形显示。但是,不能对他们的打印机做同样的假定。一些打印机也许具有非常低的分辨率,或者根本不支持图形打印。在打印程序中必须考虑到这些问题。¾用户从来没有看到过诸如“显示超出屏幕空间”、“请插入更多的屏幕空间”此类的信息,但是肯定见过“打印纸不够”的信息。当这些错误发生时,WindowsNT/2000和Windows95/98能够处理这些错误,但程序员应该向用户提供在发生这些问题时取消打印的办法。¾对于屏幕上的文本和图形来说,硬拷贝操作看起来是不同的。打印机和显示器具有非常不同的分辨率。300×300的位图在640×480的显示器中显得很漂亮。但是在300dpi的激光打印机上,它仅仅是一个1×1inch的小方块。程序员必须负责调整打印程序,使用户不必用放大镜就可以看清他们的打印输出。5.2打印操作常用函数表5-3所示是WindowsAPI打印操作的常用函数。第5章打印127表5-3WindowsAPI打印操作常用函数函数说明AbortPrinter在假脱机的情况下删除打印缓冲文件AbortProc当打印作业取消时调用的一个应用程序定义的回调函数AddForm为指定的打印机从有效窗体列表中新增一个窗体AddJob获取一个文件名用来保存打印缓冲工作AddMonitor新安装一个打印机管理器AddPort新增一个打印机端口AddPrinter在指定的服务器上新安装一个打印机AddPrinterConnection在当前用户和指定的打印机之间建立一个联系AddPrinterDriver为本地或网络打印机安装打印机驱动程序AddPrintProcessor在指定的打印服务器上安装一个打印处理器AddPrintProvidor新增一个打印机支持器AdvancedDocumentProperties设置打印机的高级属性ClosePrinter关闭指定的打印机ConfigurePort通过端口设置对话框来设置指定服务器上的端口ConnectToPrinterDlg显示一个浏览对话并与网络打印机连接DeleteForm从窗体列表中删除一个窗体名称DeleteMonitor删除打印机监视器DeletePort删除打印机端口DeletePrinter删除指定的打印机对象DeletePrinterConnection删除一个打印机连接DeletePrinterData删除打印机的配置数据DeletePrinterDriver删除指定打印机的驱动程序DeletePrintProcessor删除一个打印机的处理器DeletePrintProvidor删除一个打印机的支持器DocumentProperties取得或设置打印机的初始化信息或显示打印机配置对话框EndDocPrinter结束指定打印机上的打印作业EndPagePrinter在指定打印机上结束一页并开始新的一页EnumForms列举打印机支持的窗体信息EnumJobs获取打印机的作业信息EnumMonitors获取指定服务器上的打印监视器信息EnumMonitors获取指定服务器上的打印监视器信息EnumPorts列举指定服务器上支持的端口信息GetPrinter获取指定打印机的信息GetPrinterData获取指定打印机的配置信息GetPrinterDriver获取指定打印机驱动程序的数据信息GetPrinterDriverDirectory获取指定打印机驱动程序所在的目录GetPrintProcessorDirectory获取指定服务器上打印处理器所在的目录OpenPrinter获取指定打印机或服务器的句柄128第5章打印(续表)函数说明PrinterMessageBox显示打印异常信息对话框PrinterProperties显示指定打印机的属性对话框ReadPrinter从指定的打印机读取数据ResetPrinter设置打印机的数据类型和设备模式等ScheduleJob获取指定打印作业的打印缓冲时间表SetForm设置指定打印机的窗体信息SetJob暂停、继续、取消和重新开始指定打印机上的打印作业SetPort设置打印机端口的状态SetPrinter设置打印机的状态信息SetPrinterData设置打印机的配置信息StartDocPrinter通知打印缓冲器一个打印作业将被送往打印StartPagePrinter通知打印缓冲器一个页面将送往打印WritePrinter通知打印缓冲器数据将被写到指定的打印机5.3打印操作这一节我们为读者介绍实现简单的打印输出的方法。5.3.1打印文本在Delphi中实现文本的打印功能需要做的只是取得打印参数,打开打印机,然后发送文本的每一行内容。在Delphi中提供了一个Printers程序单元,它说明了一个TPrint对象,封装了Windows打印工作和输出打印机之间的接口,并提供常用的属性和方法,其中画布Canvas是一个非常有用的属性,它代表了当前打印文件的表面,是以图形方式来工作的,整个的打印输出工作仅仅是将用户打印的内容输出到TPrinter的属性Canvas上,当全部的输出工作完成之后,打印对象(TPrinter)把Canvas的属性值送到打印机上。一个例子:在Form中加入Memo,PrintDialog,PrintSetupDialog和两个Button控件,两个Button的Caption分别为“打印设置”和“打印”。然后编写Button的事件驱动程序如下:implementusesprinters;{$R*.DFM}procedureTForm1.BitBtn1Click(Sender:TObject);beginPrinterSetupDialog1.Execute;//选择输出的打印机以及其他打印控制选项end;procedureTForm1.BitBtn2Click(Sender:TObject);varlines:integer;第5章打印129prntext:system.text;//将prntext声明为一个在system程序单元中定义的文本文件beginifPrintDialog1.Executethenassignprn(prntext);//将prnsetup分配给打印机rewrite(prntext);//调用rewrite函数,为输出打开已分配的文件printer.Canvas.font:=memo1.font;//把当前Memo1的字体指定给打印对象的Canvas的字体属性forlines:=0tomemo1.lines.count-1dowriteln(prntext,memo1.lines[lines]);//把Memo的内容写到打印机对象System.close(prntext);end;procedureTform1.FormCreate(Sender:TObject);beginmemo1.lines.loadfromfile(‘C:\dos\os2.txt’);//在Form建立时读入文件C:\dos\os2.txtend;5.3.2打印位图打印位图也很简单。下面列出了相应代码。procedureTBMPForm.mmiPrintClick(Sender:TObject)begininherited;withImgMain.Picture.BitMapdobeginPrinter.BeginDoc;Printer.Cavas.StretchDraw(Cavas.ClipRect,ImgMain.Picture.Bitmap);Printer.EndCode;end;end;调用TCanvas.StretchDraw()来打印位图仅需三行代码。在Delphi中,位图的默认格式是DIB格式,而DIB格式正是打印机驱动程序所需要的,这就大大简化了打印位图的工作。如果遇到一个非DIB格式的位图,可以把它复制给一个临时的TBitmap对象,然后把TBitmap.HandleType特性设为bmDIB,以强制把位图临时转化为DIB格式,这样就可以打印出DIB格式的位图。注意打印的关键之一是打印图像时能够以其与在屏幕上近似相同的尺寸打印。例如,一个3×3inch的图像在640×480的屏幕上要比在300dpi的打印机上需要较少的像素。因此,在调用StretchDIBits()时,把位图位伸以便与
本文标题:Delphi 6集成开发环境05
链接地址:https://www.777doc.com/doc-904198 .html