在PowerBuilder应用程序的开发中,各种报表的打印功能是必不可少的。Power-Builder4.0提供了大量与打印机进行通信的内部函数,用于各种打印输出。运用这些函数,您不仅可以打印常见的DataWindow对象,还可以打印字符串、位图、图形对象,甚至是全屏。 DataWindow的两种打印方法: 在PowerBuilder中我们可以有两种方法打印DataW-indows。一种最简单的方法就是直接地将DataWindow提交给打印机,另一种方法是将大量的DataWindow(或混合其他的对象)放在一起作为一个单一的打印作业提交输出。 法一:不指定打印作业,而发送一个单一的DataW-indow。将报表传给打印机输出的最简单的方式是使用DataWindow对象的Print()函数,您只需简单指明您打印的DataWindow控件的名字就可以得到该DataWindow生成的报表了。例: dw_data.print({cancel dialog}) Print()函数不需要任何参数,但是它有一个可选参数,可以控制PowerBuilder是否显示Print Cancel对话框窗口(缺省为自动出现,如图1所示)。Cancel dialog参数是一个布尔型变量,其缺省值为真。 一 Print:HP LaserJet HP on LPT1: Preparing page 1 of 2 Cancel 图1:除非特别指定,否则将在打印时缺省出现Print Cancel对话框。Print()函数还有一些格式可控制打印正文字符串,但是它们要求首先打开一个打印作业。这些格式将在后面解释。 法二:集成多个DataWindow作为一个打印作业。您可以将提交打印的多个DataWindow作为一个单一的打印指令。为实现这一功能必须打开一个所谓打印作业(Print job),即发送给打印机一个单一工作单元,其中可以包含多个子任务。在PowerBuilder中一个打印作业由它的作业代号唯一指定。我们使用PrintOpen({job name})函数打开一个作业,并得到打印作业号。PrintOpen()函数有一个可选参数,就是打印作业名称,这个作业名字将作为Windows 3.x的Print Manager作业集中的名字。当您使用PrintOpen()函数时,系统将另起一页开始打印。当然在打印作业中,您还可以使用其他函数换页,比如将在后面讲述的PrintPage()函数。 在您打开了一个作业号后,就可以在这个作业内使用下列函数继续其他各种各样的打印项目。 1)在打印作业中加入字符串: 我们也可以使用另外一个与Print()函数略微不同的函数来打印字符串: PrintText(print_job_number,string,x,y{,font_number}) 这个函数将包含在string参数中的正文字符串当作一个对象进行打印。这个打印的字符串在由X,Y参数(以千分之一寸为单位)指定的坐标处开始。font_number参数是一个可选参数,缺省使用当前字型,否则font_number的值可以从0到8,0是打印机缺省的字型,1-8是使用后面讲述的PrintDefineFont()函数定义的字型。这个函数不像其他指定坐标的函数,它将改变打印光标的位置。这个函数的返回值是打印光标的新X坐标,但它不改变Y坐标。 在打印作业中打印对象 下面的这些函数可以使您在打开的打印作业中打印不同的对象。这些函数中的任一个指定X、Y坐标的函数都不会改变当前打印光标位置。 objectname.Print(print_job_number,x,y {,width,height}) 这个函数可以将任何一个object_name指定的对象放在print_job_number定义的打印作业中打印,这个对象可以是一个窗口也可以是一个DragObject类的继承类(包括了所有的窗口控件)。X、Y参数指定了一页中的坐标,您可以指出所打印对象出现的位置(以千分之一寸为单位)。Width和Height参数是可选的参数,用来指明你所需的打印对象的宽和高(仍以千分之一寸为单位)。如果缺省,PowerBuilder将使用对象本身的尺寸打印。 PrintBitmap(print_job_number,bitmap,x,y,width,height) 这个函数将在由X,Y参数(千分之一寸为单位)指定的打印区域上打印一个位图。bitmap参数是一个包含要打印位图的文件名的字符串(例:BRUSH.BMP)。Width和Height参数指定位图显示的宽和高,这个参数并不是可选的。输入0值,意味着位图按它本身的值打印。 PrintDataWindow(print_job_number,datawindowcontrol) 这个函数将一个DataWindow控件的内容作为这个指定的打印作业的一部分来打印。由于Power-Builder使用在DataWindow对象中定义的字型,Print-DefineFont()和PrintSet-Font()函数不对其产生影响。Powersoft建议如用PrintDataWindow,那么在这个打印作业中就不需要使用其它函数。因为这个函数将使用整张纸,每一次调用PrintDataWidnow,您打印的下一项都将另起一页。 PrintLine(Print_job_number,X1,Y1,X2,Y2,thickness) 这个函数将打印一指定宽度的线。这条线将在由X1,Y1参数(以千分之一寸为单位)指定的坐标处开始,在由X2,Y2参数(也以千分之一寸为单位)指定的坐标处结束。thickness参数是一个整型变量,它指定了这条线的宽度,以千分之一寸为单位。 PrintOval(print_job_number,x,y,width,height,thickness) 这个函数打印一个椭圆(如果宽度和高度相同则形成一个圆)它的轮廓线的宽度由thickness指定。椭圆都由一个想象的边框包围,X,Y参数指定了这个界框的左上角的位置(千分之一寸为单位),width,heigh为这个边框的高和宽。 PrintRect(print_job_number,x,y,width,height,thickness) 除了它是打印一个矩形外,这个函数与PrintOval()函数完全一样。 PrintRoundRect(print_job_number,x,y,width,height,thickness) 除了它是打印一个圆角矩形外,这个函数与PrintO-val()函数完全一样。 打印控制函数 PowerBuilder提供了一组打印控制函数来控制要交给打印机打印的对象。第一个函数PrintOpen()在这章的前面我们已介绍过了,其它还有: PrintCancel(print_job_number) 这个函数将中止打印作业号所打印的作业,不发送任何内容给打印机。 datawindowcontrol.PrintCancel() 这个函数与上一函数的区别是:这个函数取消的是用Datawindowcontrol.Print()提交的作业。 PrintClose(print_job_number) 这个函数将关闭指定的打印作业并且把它发给打印机(或者假脱机程序)。为了避免挂起打印作业,所有打开的打印作业都应在应用的结束前被关闭或取消。 PrintDefineFont(print_job_number,fontnumber,facename,height,weight,font-pitch,fontfamily,italic,underline) 你可以用这个函数定义字型。Power-Builder允许在一个打印作业中使用八种字型,用这个函数可定义其中的任一个。这个字型所属的打印作业号由Print_job_number参数指定,font_number参数是这个打印作业所采用的字型号(1-8)。其余的参数描述了字型如何显示,是否斜体字、粗体和下划线等。facename参数是一个包含了你所定义的字体名字的字符串(例:courier 100CPI)。height参数是你所需的以千分之一寸为单位的字体的高度(例:250将是一个18点阵courier 10 CPI字体),height参数也可使用一负值来表示点阵数指定点尺寸(例:-18是18点阵)。weight参数值是您所要的字型的笔画权值(例:400是平常正文,700是粗体)。fontpitch参数是一个枚举数据类型,它指定了字体的间距(Default!,Fixed!或variable!);fontfamily参数也是一个枚举类型,指定了字体系列(AnyFont!,Decorative!,Mod-ern!,Roman!,Script!,Swiss!)。这两种参数只在基于Windows的操作系统中使用,在Macintosh等机器中不能使用。italic参数是一个布尔型变量,指定字体是斜体(True)或非斜体(False),underline参数也是一个布尔值,用法同上。 PrintOpen() 这个函数已在这章的开始讲述过了,它定义一个打印作业以便将所有的打印项成组发送给打印机。它的返回值是唯一的打印作业ID,如果返回值为负,则意味着产生错误。 PrintPage(print_job_number) 这个函数将指定的打印作业的当前页传送给打印机(或假脱机程序),并另起一页用于之后的打印集。 PrintSend(print_job_number,string{,zero_character}) 这个函数在打印作业中发送一个特定的字符串给打印机。这个字符串一般是一个包含转义字符的命令串用来启动或操作打印机。这些打印机的控制代码因打印机的不同而不同,您应查询您的打印机手册来得到正确的代码。 这个与打印机进行通信的字符串应是一个ASCII码集,并以ASCII码0来结束。如果你需要发送ASCII码0,你可以用另外的一个字符来替代0,给定的这个替代字符的ASCII值由可选参数zero-character来指定。这个函数一般用于改变纸的定向(Landscape或por-trait)或者改变打印用的纸盘等。 PrintSetFont(print_job_number,fontnumber) 这个函数设置当前打印机字体,它是你使用PrintDefineFont()函数中定义的八个字体中的一个。 PrintSetSpacing(print_job_number,spacing) 这个函数使用Spacing参数来决定正文行之间的行距。这个值乘以当前字体高得到行距,缺省值是1.2。 PrintSetup() 这个函数调用Windows的Print Setup对话框,实际显示的Setup窗口依赖于你所安装的打印机驱动程序。 PrintWidth(print_job_number,string) 这个函数的sting参数返回字符串的宽度(以千分之一寸为单位)。返回值的大小是依赖于当前选择的字体。 PrintX(print_job_number) 这个函数返回当前打印光标的X坐标(水平)值。 PrintY(print_job_number) 这个函数返回当前打印光标的Y坐标(垂直)值。 除非特别说明,上述函数的返回值1意味着成功,-1意味着失败。 DataWindow控件的打印属性 使用modify函数,我们可以改变DataWindow的打印属性。在打印DataW-indow之前,我们可以调用如图所示的窗口,从而得到我们想让用户设置的参数。这个窗口在PowerBuilder Enterprise的实例库中,您也可以在直接调用它前对其显示界面进行汉化和作适当修改。 例如,我们使用下面语句来改变我们想打印的份数。 dw_data..Modify("DataWindow.Print.Copies=3") 你可以使用PowerBuilder Enterprise打包软件DWSYN40.EXE----DataWindow语法生成器来建立Modify语句。 下面所列的可以修改的参数全部以DataWindow.print为前缀,后接这个属性。 Collate=Yes or No(缺省为no,不作校对) 这个属性用来指示是否要对打印进行校对。校对通常较慢,因为整个打印过程必须反复几次以得到一个校对后的结果。 Color=1(彩色)or 2(单色) 这个属性指示传送给打印输出的是彩色(如果你有一台彩色打印机)还是单色。 Columns=<an integer>(缺省为1) 这个属性用来指示DataWindow以报纸风格打印在一页上的栏的数量。 Columns.Width=<an integer> 这个属性指示以报纸风格打印的栏的宽度(基于为DataWindow指定的单位)。 Copies=<an integer> 这个属性指示你所需的打印的数量。 DocumentName=<a string> 这个属性可以让你为文件设置一个名字。这个名字在DataWindow传送给打印机时在打印序列中出现。 Duplex=1(单一)or 2(水平)or 3(垂直) 这个属性指示打印输出的方向。 Filename=<filename string> 这个属性仅当把DataWindow输出为一个文件时才有用。这个属性包含的字符串是将在磁盘中存储的文件的名字。 Margin.Bottom=<an integer> 这个属性为一整型指示页面下部空白的宽度(用DataWindow指定的单位) Margin.Left=<an integer> 功能与Margin.Botton相同,但指示的是左侧空白宽度。 Margin.Right=<an integer> 功能与Mangin.Bottom相同,但指示的是右侧空白宽度。 Margin.Top=<an integer> 功能与Mangin.Bottom相同,但指示的是顶端空白宽度。 Orientation=0(打印机的缺省设置)或2(横向打印)或3(纵向打印)这个属性用来指示打印定向。你可以使用打印机缺省设置,或者设置成Landscape或Portrait模式,覆盖缺省的打印设置。 Page.Range=<page range string> 这个属性为一字符串指明你要打印的页数。在字符串中的数字用逗号分隔,或者数字之间用由一横线分隔表示一范围或两者同时使用,例如:"1,2,3,6-12",空字符串表示要打印所有的页。 Page.RangeInclude=0(全部打印)或1(打印奇数页)或2(打印偶数页) 这个属性用来指示在Page.Range指示的范围中哪些页要打印。你可以先选择打印偶数页,然后将纸放入打印机中,再选择奇数页打印。这一功能像在打印书时那样,需在纸的两面打印时非常有用。 Paper.Size=<an integer> 这一属性用来指示打印纸的尺寸。可接受的值如下: 0-缺省 1-Letter 8 1/2 x 11 in 2-LetterSmall 8 1/2 x 11 in 3-Tabloid 17 x 11 inches 4-Ledger 17 x 11 in 5-Legal 8 1/2 x 14 in 6-Statement 5 1/2 x 8 1/2 in 7-Executive 7 1/4 x 10 1/2 in 8-A3 297 x 420 mm 9-A4 210 x 297 mm 10-A4 Small 210 x 297 mm 11-A5 148 x 210 mm 12-B4 250 x 354 13-B5 182 x 257 mm 14-Folio 8 1/2 x 13 in 15-Quarto 215 x 275 mm 16-10 x 14 in 17-11 x 17 in 18-Note 8 1/2 x 11 in 19-Envelope #9 3 7/8 x 8 7/8 20-Envelope #10 4 1/8 x 9 1/2 21-Envelope #11 4 1/2 x 10 3/8 22-Envelope #12 4 x 11 1/276 23-Envelope #14 5 x 11 1/2 24-C size sheet 25-D size sheet 26-E size sheet 27-Envelope DL 110 x 220 mm 28-Envelope C5 162 x 229 mm 29-Envelope C3 324 x 458 mm 30-Envelope C4 229 x 324 mm 31-Envelope C6 114 x 162 mm 32-Envelope C65 114 x 229 mm 33-Envelope B4 250 x 353 mm 34-Envelope B5 176 x 250 mm 35-Envelope B6 176 x 125 mm 36-Envelope 110 x 230 mm 37-Envelope Monarch 3.875 x 7.5 in 38-6 3/4 Envelope 3 5/8 x 6 1/2 in 39-US Std Fanfold 14 7/8 x 11 in 40-German Std Fanfold 8 1/2 x 12 in 41-German Legal Fanfold 8 1/2 x 13 in Paper.Source=<an integer> 这一属性是一个整型值,指明纸的来源。可接受的值如下: 0-Default 1-Upper 2-Lower 3-Middle 4-Manual 5-Envelope 6-Envelope manual 7-Auto 8-Tractor 9-Smallfmt 10-Largefmt 11-Large capacity 14-Cassette Preview=Yes(进入打印预览状态)或No(缺省-退出打印预览状态) 这个属性允许您的DataWindow进入和退出打印预览状态。这种状态可以所见即所得地看到用户即将打印的结果。 Preview.Rulers=Yes(显示标尺)或No(缺省-不显示标尺) 这个属性是指Print Preview状态下,是否要在DataWindow对象上显示标尺。 Preview.Zoom=<an integer> 这个属性是Print Preview状态下,为预览的DataWindow指定一个放缩因子。缺省值为100%(Preview.zoom=100%) Prompt=Yes(缺省-显示提示)或No(无提示) 这个属性可以控制PowerBuilder显示一个允许用户在作业打印前取消打印作业的提示。 Quality=0(缺省)or 1(高)or 2(适中)or 3(低)or 4(草稿) 这个属性可以选择打印输出的质量。 Scale=<an integer> 这个属性指定打印输出放大或缩小的比例。 制作一个屏幕打印:如何打印全屏 PowerBuilder 4.0的一个新特征是可以把屏幕图像提交打印作业,在纸上的任一点打印屏幕。我们使用PrintScreen()函数实现这一功能。 PrintScreen()的语法如下: PrintScreen(print_job_number,x,y{,width,height}) 执行这一函数,在指定的打印作业中将当前屏在由X,Y参数(千分之一寸为单位)指定的坐标处打印。width和height参数指示你所要的打印屏幕的宽和高。最后这两个参数是可选的,如果缺省,屏幕将按初始的宽度和度打印。