编写VB打印控制程序的几点心得.doc

上传人:wux****ua 文档编号:9261455 上传时间:2020-04-04 格式:DOC 页数:8 大小:33KB
返回 下载 相关 举报
编写VB打印控制程序的几点心得.doc_第1页
第1页 / 共8页
编写VB打印控制程序的几点心得.doc_第2页
第2页 / 共8页
编写VB打印控制程序的几点心得.doc_第3页
第3页 / 共8页
点击查看更多>>
资源描述
Visual Basic(VB)给用户提供了可视化编程环境,因其简单易学、功能强大而得到了广泛的应用。VB提供了两种实现打印的方法。一般在对打印质量要求不高的场合,或者是编程项目的早期开发过程中,可以直接使用VB窗体的Printform方法实现打印。用这种方法实现打印具有编程简单、易用并且功能强大的优点,它只需要通过一行代码,几乎能打印所有内容。实现的方法就是:首先将要打印的内容在屏幕上显示出来,然后开发人员只要为窗体对象激活 PrintForm ,窗体则自动将要打印的内容发送到Printer对象上,其语法格式如下:窗体.PrintForm 。如果窗体中包括图形,那么打印前应先置窗体的AutoRedraw属性为真。这种方法虽然简单,但是它却存在着内存消耗大、打印粗糙、速度慢等缺陷,尤其对于带有滚动条的图像,这种方法只能打印当前可视的区域 。在实际应用中经常会遇到对打印质量要求很高的场合,例如打印音乐五线谱,对打印的美观、清晰度以及音符符头的位置都有很严格的要求,这种应用场合若采用VB提供的另一种基于Printer对象的打印方法则可以获得高分辨率的打印,得到很高的打印质量。在实际应用中,也可以根据实际应用情况将上述两种方法结合起来使用,即:前期工作使用PrintForm 简单的打印方法将窗体的布局定下来,后期再使用基于Printer对象的打印方法实现最终的打印工作。 2高分辨率打印程序开发心得 Printer对象 VB的打印可以使用Printer对象。Printer对象是一个独立于打印机设备的封装,它可以代表不同的打印机,初始时,Printer对象为系统缺省的打印机,也可以使用下列语句:Set Printer=Printers(2) (其中2代表Printers集中的第二个打印机)对打印机进行指定。 Printer对象具备例如:ColorMode、Copies、Duplex、Printquality等控制打印机特征的属性, 提供了Newpage、EndDoc、KillDoc等控制打印过程的方法,以及大多数由窗体和图片框控件提供的图形属性和方法如:Currentx、Currenty、Textwidth、Textheight、Print、Pset、Line、PaintPicture和Circle等方法,它还拥有Font的所有属性。实现高分辨率的打印就是通过控制Printer对象的上述属性和方法完成的。 直接利用Windows公用标准对话框CommonDialog控件【打印】VB为用户提供了Windows公用标准对话框CommonDialog控件:【打开】、【文件另存为】、【颜色】、【字体】、【打印】。CommonDialog控件在Visual Basic 和Microsoft Windows动态连接库Commdlg.dll例程之间提供了接口。利用公用标准对话框【打印】开发VB的打印程序,将大大缩短程序的开发周期。应用程序中要使用公用对话框,必须首先在工具箱中添加公用对话框控件。该动作通过激活【部件】对话框,选中Microsoft Common Dialog Control6.0, 单击【确定】即可。然后再将公用控件添加到窗体上并设置相应属性,该控件具有的属性有Color、Font、Print、Help等。 VB提供mnuFilePrint_Click()过程供用户添加开发的打印程序代码。 Printer对象控制打印的基本过程 利用Printer对象开发的打印程序主要靠其提供的NewPage (打印新的一页,CurrentX、CurrentY置为新页的左上角,可完成多页功能。)、EndDoc (将打印任务加入打印机队列)、KillDoc (取消打印任务)控制打印过程的。一般情况下,打印程序完成多页打印时会多次执行NewPage,结束时执行一次EndDoc将打印任务加入打印机队列。如果你在NewPage后,立即使用EndDoc,VB则不会打印额外的空白页。如果希望显示空白页,则可在新的一页上只使用Printer.Print “ “打印空字符即可。为了通过Printer对象实现文本和图形的打印,获得最好的打印质量,还需要对VB控制打印机的多种属性有更深入的理解,例如打印机的坐标体系向屏幕坐标体系的转换、打印机字体尺寸的确定等。下面给出了打印程序的主框架:Private Sub mnuFilePrint_Click() On Error Resume Next If ActiveForm Is Nothing Then Exit Sub With dlgCommonDialog 打印机公用对话框 .DialogTitle = 打印 .CancelError = True .Flags = 1 Printer.FontSize = dlgCommonDialog.FontSize 将打印机公用对话框设置的字体大小传递给打印机 .ShowPrinter 在屏幕上显示【打印】公用对话框 If Err MSComDlg.cdlCancel Then Printer.FontTransparent = False 初始化打印的字体为不透明 SetPrinterScale Myform 匹配打印机的缩放属性与窗体的属性 PrintAnywhere Printer 可放置用户编写的打印对象参数化例程 实现字符和图形的显示Printer.NewPage 打印机坐标初始化PrintAnywhere Printer 打印另一页的内容Printer.NewPage 打印机坐标初始化 Printer.EndDoc 将该任务加入打印机任务队列 不打印空白页 Printer.KillDoc 取消当前的打印任务 End If End With End Sub 参数化绘图程序用VB开发应用程序时,如果使用参数化绘图例程进行屏幕显示程序的开发,则在开发打印程序时,就不需再另行开发代码,从而避免了大量的重复劳动,有效地缩短了程序的开发周期。参数化绘图例程就是:在开发例程时,为每一个例行程序提供一个OBJECT类型的参数,调用程序通过向例程的OBJECT类型参数分别传递窗体、Printer对象,就可分别完成屏幕显示与打印机输出。 见如下示例:Sub PrintAnywhere(Dest As Object)Dest.Print “HELLO!”Dest Is Printer Then Printer.EndDocEnd IfEnd Sub要完成屏幕上的输出,调用 PrintAnywhere Myform 即可,而调用 PrintAnywhere Printer则完成在打印机上输出。 属性匹配与窗体缩放因为控制打印机实际绘图区域大小的属性Height和Width,由目前正在使用的纸张决定,而且可打印的区域与纸张边缘有一定距离。因而为了获得正确的打印输出结果,不能简单地将Printer对象直接传递给绘图例行程序,还必须要解决打印机的缩放属性与显示窗体属性相匹配的问题。即:保证使窗体中的打印内容以正确的大小显示,并居于可打印区域的中间。实际上实现的是打印机的坐标体系向屏幕坐标体系的转换。具体过程是:使用打印机的ScaleX和ScaleY方法,获取以twip为单位的打印机尺寸,再利用窗体的ScaleX和ScaleY方法将这些尺寸转换为窗体中的坐标系统,从而实现以窗体的坐标系统提供打印机可打印区域大小的目的。然后,用这些尺寸作为打印机中新的ScaleWidth和ScaleHeight,即可实现属性匹配。但是,我们在打印时,经常会遇到这样的场合在不改变窗体形状的情况下,需要扩大或缩小窗体的大小。要完成这样的工作,不仅需要完成属性匹配,还要确定对象被缩放的系数。程序如下:Private Sub SetPrinterScale(obj As Object)Dim pwid As Single, phgt As Single, xmid As Single, ymid As SingleDim owid As Single, ohgt As Singleowid = obj.ScaleX(obj.ScaleWidth, obj.ScaleMode, vbTwips) ohgt = obj.ScaleY(obj.ScaleHeight, obj.ScaleMode, vbTwips) 获取窗体以Twips表示的尺寸pwid = Printer.ScaleX(Printer.ScaleWidth, Printer.ScaleMode, vbTwips)phgt = Printer.ScaleY(Printer.ScaleHeight, Printer.ScaleMode, vbTwips)获取打印机以Twips表示的尺寸If (ohgt / owid phgt / pwid) Then s = phgt / ohgtElse s = pwid / owidEnd If 计算缩放因子pwid = obj.ScaleX(pwid, vbTwips, obj.ScaleMode) / sphgt = obj.ScaleY(phgt, vbTwips, obj.ScaleMode) / s 将打印机的尺寸转换成obj的坐标系统 / 缩放因子x_mid = obj.ScaleLeft + obj.ScaleWidth / 2y_mid = obj.ScaleTop + obj.ScaleHeight / 2设置打印区域的中心点坐标Printer.Scale (x_mid - pwid / 2, y_mid - phgt / 2)-(x_mid + pwid / 2, y_mid + phgt / 2) 设置打印机中新的ScaleWidth和ScaleHeightEnd Sub 坐标定位 窗体、图片框控件以及Printer对象提供的TextWidth和 TextHeight方法在文本定位的应用方面很有用。TextWidth、 TextHeight分别以对象当前的刻度单位返回字符串的宽度和高度。但是必须注意很多字体中其字符宽度并不全部相同,所以不能简单地将单个字符的宽度乘以字符数来获得字符串的宽度。对那些没有TextWidth和TextHeight的控件可通过设置父窗体的Font属性,使其与该控件的属性相匹配,再利用父窗体的TextWidth和TextHeight获得它的字符串的宽度和高度。但是,我们在完成屏幕显示程序调试后,在进行打印输出时却出现了屏幕显示与打印结果的不一致性的现象,表现在所打印的字体之间坐标关系与屏幕显示不一样,例如:屏幕显示上的两个字符不重叠,而打印出的字符却出现相互重叠的现象。经调试发现,问题出现在字体尺寸的确定上。 程序中,屏幕上显示的字符坐标是通过对象的TextWidth和TextHeight方法计算得来的,它直接受到字体尺寸大小的影响。VB向用户提供的字体是在用户需要的打印机点的范围内,如果你需要的字体大小为73点, 则打印出的实际字体大小为72.75。然而窗体、图片框控件的Fontsize只能是整数,例如它不能将字体的大小定为72.75,实际上这就造成了屏幕上显示字体与实际打印字体大小之间产生了误差。 我们采用如下方法来解决该问题,就是在计算字体大小时,根据计算出来的字体尺寸,确定它存在的范围,然后再将它定位到VB提供的几种固定大小的字体上,而不是随意指定。当然,也可以有其它的解决办法。例如:字体大小选取偶数等。 由于篇幅所限,这里不再作介绍。VB中Grid控件的打印方法Grid控件是Visual Basic(以下简称VB)最常见控件之一,用它可以以表格的形式显示、浏览数据。特别是在数据库应用中,直接绑定即可显示和浏览数据库信息。然而,美中不足的是Grid没有编辑和打印功能,列与列的位置不能相互交换。笔者曾尝试着给Grid增添了这些功能,使之功能更强大。下面给出改进方法及源程序,读者可参考使用。该程序在HP5/100、Window 95环境下用VB5.0调试通过。 给Grid 控件增加打印方法有三种:一是直接打印控件,二是通过p rinter 来实现打印功能,三是通过调用MS-Word及MS-Excel 来实现打印。 首先,打开一个应用,在FORM1中增加DATA控件DATA1,把DATA1的CO NNECT属性设为dBA SE,再把DATABASENAME属性设为D:PJXM.DBF。然后再在FORM1中增加MSFLEXGRID控件GRID1,并把GRID1的DATASOURCE 属性设为DATA1。这样数据库PJXM.DBF的信息就会在GRID1 中显示出来。下面分析介绍各种打印方法。 方法一:直接打印窗体 在FORM1中增加命令按钮(command),CAPTION属性设为直接打印, 再写入下列代码: Sub command_click Form1.printform End sub 这样即可通过打印窗体FORM1的方法把GRID1的数据打印出来。这种方法的缺点是只能打印GRID1中显示的数据部分,显示不出来的则无法打印,而且这种打印方法很像屏幕硬拷贝,而且不能灵活地控制字体等。 方法二:通过PRINTER实现打印 1. 加入打印命令按钮(command1)和函数(prnt1),写入下面代码, 读者稍加改动可写成标准的函数或过程。color=#0000a0Function prnt1 (x As Int eger, y As Integer, font As Sing le, txt As String) printer.CurrentX = x printer.CurrentY = y printer.FontBold = False printer.FontSize = font printer.Print txt End Function Sub command1_click Dim fnt As Single Dim pp as integer Pp=0 设置开始页码0 Dim stry,strx,strx1,stry1,linw,page1,p As Integer Static a(8) As Integer 定义打印的列数 ss$ = 内部结算存入款对帐单 定义表头 kan = 0 For i = 0 To 8 a(i) = 1500 定义每列宽 kan = kan + a(i) 计算表格总宽度 Next page1 = 50 定义每页行数 strx = 200 strx1 = 200 定义X方向起始位置 stry = 1400 stry1 = 1400 定义Y方向起始位置 linw = 240 定义行宽 fnt = 8 定义字体大小 printer.fontname = 宋体 定义字体 dd = prnt1(4000, 700, 18, ss$) 打印标题 printer.Line (strx - 50, stry - 30)-(strx + kan - 10, stry - 30) For j = 0 To gridrow - 1 gridrow为所要打印的行数 grid1.row = j strx = strx1 printer.Line (strx - 50, stry - 30)-(strx + kan - 10, stry - 30) p = p + 1 For i = 0 To 8 grid1.col = i dd = prnt1(strx, stry, fnt, grid1.text) strx = strx + a(i) Next If p page1 Then next page p = 0 strx = strx1 printer.Line (strx - 50, stry + linw)-(strx + kan - 10, stry + linw) stry = stry1 For n = 0 To 8 printer.Line (strx - 30, stry - 30)-(strx - 30, stry + (page1 + 2) * linw) strx = strx + a(n) Next printer.Line (strx - 30, stry - 30)-(strx - 30, stry + (page1 + 2) * linw) pp=pp+1 foot$=第 +cstr(pp)+ 页 dd = prnt1(strx - 30-1000, stry + (page1 + 2) * linw+100, 10, foot$) 打印页脚码 printer.NewPage next page dd = prnt1(4000, 700, 18, ss$) 打印标题 strx = strx1 stry = stry1 printer.Line (strx - 50, stry - 30)-(strx + kan - 10, stry - 30) 打印第一行 Else stry = stry + linw End IfNext st = stry If p page1 Then 在最后页剩余划空行 For o = p To page1 + 1 strx = strx1 printer.Line (strx - 50, stry - 30)-(strx + kan - 10, stry - 30) stry = stry + linw Next End If stry = stry1 strx = strx1 stry = stry1line col For n = 0 To 8 printer.Line (strx - 30, stry - 30)-(strx - 30, stry + (page1 + 2) * linw) strx = strx + a(n) Next printer.Line (strx - 30, stry - 30)-(strx - 30, stry + (page1 + 2) * linw) pp=pp+1 foot$=第 +cstr(pp)+ 页 dd = prnt1(strx - 30-1000, stry + (page1 + /color2) * linw+100, 10, foot$)打印页脚码 printer.EndDoc打印结束 End sub 这种方法通过灵活的编程可以方便地调整字体、字型、线形、页面、纸张大小等,可打印出比较满意的效果。 如果计算机上装有Microsoft Word和Microsoft Excel,则可把GR ID的表格通过VB发送到这些应用程序中去,生成Microsoft Word和Mic rosoft Excel表格。这样可以充分利用它们的打印、编辑功能,打印出更理想的效果。下面逐一介绍。 方法三:通过生成Word表格打印 1. 在declaration 中写入: Dim msword As Object 2. 加入打印命令按钮(command2),CAPTION设为生成Word表格, 写入下面代码:Pri vate Sub command2_Click() screen.MousePointer = 11 Set msword = CreateObject(word.basic) Dim AppID, ReturnValue appID = Shell(d:office97officeWIN- WORD.EXE, 1) 运行Word msword.AppActivate Microsoft Word full Screen.MousePointer = 0End Sub 3. 写入以下过程full()Sub full() Dim i As Integer, j As Integer, col As Integer, row As Integer Dim cellcontent As String Me.Hide cols = 4表格的列数 row = gridrow 打印表的行数 msword.filenewdefault msword.MsgBox 正在建立MS_WORD报表,请稍候 , , -1 msword.leftpara msword.screenupdating 0 msword.tableinserttable , col, row, , , 16, 167 msword.startofdocument for j=0 to gridrow 表格的行数 grid1.row=j For i = 1 To cols Gri1d.col=i If IsNull(grid1.text) Then cellcontent$ = Else cellcontent$ = grid1.text End If msword.Insert cellcontent$ msword.nextcell Next i Next j msword.tabledeleterow msword.startofdocument msword.tableselectrow msword.tableheadings 1 msword.centerpara msword.startdocument msword.screenrefresh msword.screenupdating 1 msword.MsgBox 结束, , -1 Me.ShowEnd Sub 方法四:通过发送到Excel实现表格打印 1. 加入打印命令按钮(command3),CAPTION设为生成EXCEL表格 ,写入下面代码:Private Sub command3_Click() Dim i As Integer Dim j As Integer Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject(Excel.Application) xlApp.Visible = True Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) xlSheet.Cells(6, 1) = i For i = 0 To gridrow grid1.Row = i For j = 0 To 6 Grid1.Col = j If IsNull(Grid1.Text) = False Then xlSheet.Cells(i + 5, j + 1) = Grid1.Text End If Next j Next iEnd Sub
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!