编写VB打印控制程序的几点心得_第1页
编写VB打印控制程序的几点心得_第2页
编写VB打印控制程序的几点心得_第3页
编写VB打印控制程序的几点心得_第4页
编写VB打印控制程序的几点心得_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编写 VB 打印控制程序的几点心得Visual Basic ( VB )给用户提供了可视化编程环境,因 其简单易学、功能强大而得到了广泛的应用。 VB 提供了两 种实现打印的方法。一般在对打印质量要求不高的场合,或 者是编程项目的早期开发过程中,可以直接使用 VB 窗体的 Printform 方法实现打印。 用这种方法实现打印具有编程简单、 易用并且功能强大的优点,它只需要通过一行代码,几乎能 打印所有内容。实现的方法就是:首先将要打印的内容在屏 幕上显示出来 ,然后开发人员只要为窗体对象激活 PrintForm ,窗体则自动将要打印的内容发送到 Printer 对象 上,其语法格式如下: 窗

2、体 .PrintForm 。如果窗体中包括 图形,那么打印前应先置窗体的 AutoRedraw 属性为真。这 种方法虽然简单,但是它却存在着内存消耗大、打印粗糙、 速度慢等缺陷,尤其对于带有滚动条的图像,这种方法只能 打印当前可视的区域 。在实际应用中经常会遇到对打印质 量要求很高的场合,例如打印音乐五线谱,对打印的美观、 清晰度以及音符符头的位置都有很严格的要求,这种应用场 合若采用 VB 提供的另一种基于 Printer 对象的打印方法则可 以获得高分辨率的打印,得到很高的打印质量。在实际应用 中,也可以根据实际应用情况将上述两种方法结合起来使用, 即:前期工作使用 PrintForm 简

3、单的打印方法将窗体的布局定下来,后期再使用基于 Printer 对象的打印方法实现最终的 打印工作。2高分辨率打印程序开发心得 Printer 对象VB的打印可以使用 Printer对象。Printer对象是一个独 立于打印机设备的封装, 它可以代表不同的打印机, 初始时, Printer 对象为系统缺省的打印机, 也可以使用下列语句: Set Printer=Printers(2) ( 其中 2 代表 Printers 集中的第二个打印 机)对打印机进行指定。Printer 对象具备例如: ColorMode 、Copies 、 Duplex 、 Printquality 等控制打印机特征的

4、属性, 提供了 Newpage 、 EndDoc 、KillDoc 等控制打印过程的方法,以及大多数由窗 体和图片框控件提供的图形属性和方法如: Currentx 、 Currenty 、Textwidth 、Textheight 、Print、Pset、Line、 PaintPicture 和 Circle 等方法,它还拥有 Font 的所有属性。 实现高分辨率的打印就是通过控制 Printer 对象的上述属性 和方法完成的。 直接利用 Windows 公用标准对话框CommonDialog 控件【打印】 VB 为用户提供了 Windows 公 用标准对话框 CommonDialog 控件:

5、【打开】、【文件另存为】 、【颜色】、【字体】、【打印】。CommonDialog 控件在Visual Basic 和 Microsoft Windows 动态连接库 Commdlg.dll 例程 之间提供了接口。利用公用标准对话框【打印】开发 VB 的 打印程序,将大大缩短程序的开发周期。应用程序中要使用 公用对话框,必须首先在工具箱中添加公用对话框控件。该 动作通过激活【部件】对话框,选中 Microsoft Common Dialog Control6.0, 单击【确定】即可。然后再将公用控件 添加到窗体上并设置相应属性, 该控件具有的属性有 Color 、 Font 、Print 、H

6、elp 等。VB 提供 mnuFilePrint_Click ()过程供用户添加开发的 打印程序代码。 Printer 对象控制打印的基本过程利用 Printer 对象开发的打印程序主要靠其提供的 NewPage (打印新的一页, CurrentX 、CurrentY 置为 新页的左上角,可完成多页功能。 )、 EndDoc (将打印任 务加入打印机队列) 、KillDoc (取消打印任务)控制打印 过程的。一般情况下,打印程序完成多页打印时会多次执行 NewPage ,结束时执行一次 EndDoc 将打印任务加入打印机 队列。如果你在 NewPage 后,立即使用 EndDoc ,VB 则不

7、 会打印额外的空白页。如果希望显示空白页,则可在新的一 页上只使用 Printer.Print“打印空字符即可。为了通过 Printer 对象实现文本和图形的打印, 获得最好的打 印质量,还需要对 VB 控制打印机的多种属性有更深入的理 解,例如打印机的坐标体系向屏幕坐标体系的转换、打印机 字体尺寸的确定等。下面给出了打印程序的主框架:Private Sub mnuFilePrint_Click()On Error Resume NextIf ActiveForm Is Nothing Then Exit SubWith dlgCommonDialog 打印机公用对话 框.DialogTitl

8、e = 打印 .CancelError = True .Flags = 1Printer.FontSize = dlgCommonDialog.FontSize 将打印机公用对话框设置的字体大小传递给打印机.ShowPrinter 在屏幕上显示【打印】公用 对话框If Err <> MSComDlg.cdlCancel Then Printer.FontTransparent = False 初始化打 印的字体为不透明SetPrinterScale Myform匹配打印机的缩放属性与窗体的属性PrintAnywhere Printer 可放置用户编 写的打印对象参数化例程实现字符和

9、图形的显示Printer.NewPagePrintAnywhere Printer打印机坐标初始化 打印另一页的内容Printer.EndDoc 将该任务加 入打印机任务队列不打印空白页Printer.KillDoc 取消当前的打 印任务End IfEnd WithEnd Sub 参数化绘图程序用 VB 开发应用程序时,如果使用参数化绘图例程进行屏幕 显示程序的开发,则在开发打印程序时,就不需再另行开发 代码,从而避免了大量的重复劳动,有效地缩短了程序的开 发周期。参数化绘图例程就是:在开发例程时,为每一个例 行程序提供一个 OBJECT 类型的参数,调用程序通过向例程 的 OBJECT 类型

10、参数分别传递窗体、 Printer 对象,就可分 别完成屏幕显示与打印机输出。 见如下示例: Sub PrintAnywhere (Dest As Object ) Dest.Print “ HELLO!”Dest Is Printer ThenPrinter.EndDocEnd IfEnd Sub要完成屏幕上的输出,调用 PrintAnywhere Myform 即可, 而调用 PrintAnywhere Printer 则完成在打印机上输出。 属性匹配与窗体缩放 因为控制打印机实际绘图区域大小的属性 Height 和 Width , 由目前正在使用的纸张决定,而且可打印的区域与纸张边缘 有

11、一定距离。因而为了获得正确的打印输出结果,不能简单 地将 Printer 对象直接传递给绘图例行程序, 还必须要解决打 印机的缩放属性与显示窗体属性相匹配的问题。即:保证使 窗体中的打印内容以正确的大小显示,并居于可打印区域的 中间。实际上实现的是打印机的坐标体系向屏幕坐标体系的 转换。具体过程是:使用打印机的 ScaleX 和 ScaleY 方法, 获取以 twip 为单位的打印机尺寸,再利用窗体的 ScaleX 和 ScaleY 方法将这些尺寸转换为窗体中的坐标系统, 从而实现 以窗体的坐标系统提供打印机可打印区域大小的目的。然后, 用这些尺寸作为打印机中新的 ScaleWidth 和 S

12、caleHeight , 即可实现属性匹配。 但是,我们在打印时,经常会遇到这样的场合在不改变 窗体形状的情况下,需要扩大或缩小窗体的大小。要完成这 样的工作,不仅需要完成属性匹配,还要确定对象被缩放的 系数。程序如下: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,

13、 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) Thens = phgt / ohgtElses =

14、 pwid / owidEnd If 计算缩放因子pwid = obj.ScaleX(pwid, vbTwips, obj.ScaleMode) / s phgt = obj.ScaleY(phgt, vbTwips, obj.ScaleMode) / s将打印机的尺寸转换成 obj 的坐标系统 / 缩放因子x_mid = obj.ScaleLeft + obj.ScaleWidth / 2 y_mid = obj.ScaleTop + obj.ScaleHeight / 2设置打印区域的中心点坐标Printer.Scale (x_mid - pwid / 2, y_mid - phgt /

15、2)-(x_mid + pwid / 2, y_mid + phgt / 2)设置打印机中新的 ScaleWidth 和ScaleHeightEnd Sub 坐标定位窗体、图片框控件以及 Printer 对象提供的 TextWidth 和 TextHeight 方法在文本定位的应用方面很有用。 TextWidth 、 TextHeight 分别以对象当前的刻度单位返回字 符串的宽度和高度。但是必须注意很多字体中其字符宽度并 不全部相同,所以不能简单地将单个字符的宽度乘以字符数 来获得字符串的宽度。 对那些没有 TextWidth 和 TextHeight 的控件可通过设置父窗体的 Font 属

16、性,使其与该控件的属 性相匹配,再利用父窗体的 TextWidth 和 TextHeight 获得它 的字符串的宽度和高度。 但是,我们在完成屏幕显示程序调试后,在进行打印输出时 却出现了屏幕显示与打印结果的不一致性的现象,表现在所 打印的字体之间坐标关系与屏幕显示不一样,例如:屏幕显 示上的两个字符不重叠,而打印出的字符却出现相互重叠的现象。经调试发现,问题出现在字体尺寸的确定上。 程序 中,屏幕上显示的字符坐标是通过对象的 TextWidth 和 TextHeight 方法计算得来的, 它直接受到字体尺寸大小的影 响。 VB 向用户提供的字体是在用户需要的打印机点的范围 内,如果你需要的字

17、体大小为 73 点, 则打印出的实际字体 大小为 72.75 。然而窗体、图片框控件的 Fontsize 只能是整 数,例如它不能将字体的大小定为 72.75 ,实际上这就造成 了屏幕上显示字体与实际打印字体大小之间产生了误差。 我们采用如下方法来解决该问题,就是在计算字体大小时, 根据计算出来的字体尺寸,确定它存在的范围,然后再将它 定位到 VB 提供的几种固定大小的字体上, 而不是随意指定。 当然,也可以有其它的解决办法。例如:字体大小选取偶数 等。 由于篇幅所限,这里不再作介绍。 VB 中 Grid 控件的 打印方法Grid 控件是 Visual Basic( 以下简称 VB) 最常见控

18、件之一 用它可以以表格的形式显示、浏览数据。特别是在数据库应 用中 ,直接绑定即可显示和浏览数据库信息。然而,美中不足的是 Grid 没有编辑和打印功能 ,列与列的位置不能相互交换。 笔者曾尝试着给 Grid 增添了这些功能 ,使之功能更强大。下 面给出改进方法及源程序 ,读者可参考使用。该程序在 HP5/100 、Window 95 环境下用 VB5.0 调试通过。给 Grid 控件增加打印方法有三种 : 一是直接打印控件 二是通过 p rinter 来实现打印功能 , 三是通过调用 MS-Word 及 MS-Excel 来实现打印。首先,打开一个应用 ,在 FORM1 中增加 DATA 控

19、件 DATA1,把 DATA1 的 CO NNECT 属性设为 dBA SEM ,再把 DATABASENAME 属性设为 D:/PJXM.DBF 。然后再在 FORM1 中增加 MSFLEXGRID 控件 GRID1, 并把 GRID1 的 DATASOURCE 属性设为 DATA1 。这样数据库 PJXM.DBF 的信息就会在 GRID1 中显示出来。下面分析介绍各种打印 方法。方法一 :直接打印窗体在 FORM1 中增加命令按钮 (command),CAPTION 属性 设为直接打印 , 再写入下列代码 :Sub command_clickForm1.printformEnd sub这样

20、即可通过打印窗体 FORM1 的方法把 GRID1 的数 据打印出来。这种方法的缺点是只能打印 GRID1 中显示的 数据部分 ,显示不出来的则无法打印 ,而且这种打印方法很像 屏幕硬拷贝 ,而且不能灵活地控制字体等。方法二 :通过 PRINTER 实现打印1. 加入打印命令按钮 (command1) 和函数 (prnt1), 写入面代码 , 读者稍加改动可写成标准的函数或过程Function prnt1 (x As Int eger, y As Integer, font As Sing le, txt As String)printer.CurrentX = x printer.Curre

21、ntY = y printer.FontBold = False printer.FontSize = font printer.Print txt End Function Sub command1_click Dim fnt As Single Dim pp as integerPp=0 设置开始页码 0Dim stry,strx,strx1,stry1,linw,page1,p As Integer Static a(8) As Integer 定义打印的列数 ss$ = 内部结算存入款对帐单 定义表头 kan = 0For i = 0 To 8a(i) = 1500 定义每列宽 kan

22、 = kan + a(i) 计算表格总宽度 Nextpage1 = 50 定义每页行数strx = 200strxl = 200定仪方向起始位置stry = 1400stryl = 1400定仪方向起始位置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 - 1gridrow为所要打印的行数grid1.

23、row = jstrx = strx1printer.Line (strx - 50, stry - 30)-(strx +kan - 10, stry - 30)p = p + 1For i = 0 To 8grid1.col = idd = prnt1(strx, stry, fnt, grid1.text)strx = strx + a(i)NextIf p > page1 Then next pagep = 0 strx = strx1printer.Line (strx - 50, stry + linw)-(strx + kan - 10, stry + linw)stry

24、= stry1For n = 0 To 8printer.Line (strx - 30, stry - 30)-(strx- 30, stry + (page1 + 2) * linw)strx = strx + a(n)Nextprinter.Line (strx - 30, stry - 30)-(strx -30, stry + (page1 + 2) * linw) pp=pp+1foot$= 第 +cstr(pp)+ 页 dd = prnt1(strx - 30-1000, stry + (page1 +2) * linw+100, 10, foot$)打印页脚码printer.

25、NewPage next pagedd = prnt1(4000, 700, 18, ss$)打印标题strx = strx1stry = stry1 printer.Line (strx - 50, stry - 30)-(strx +kan - 10, stry - 30) 打印第一行Elsestry = stry + linwEnd If Nextst = stryIf p & lt; page1 Then在最后页剩余划空行For o = p To page1 + 1strx = strx1 printer.Line (strx - 50, stry - 30)-(strx +kan -

26、 10, stry - 30) stry = stry + linwNextEnd Ifstry = stry1strx = strx1stry = stry1 line colFor n = 0 To 8printer.Line (strx - 30, stry - 30)-(strx -30, stry + (page1 + 2) * linw) strx = strx + a(n)Nextprinter.Line (strx - 30, stry - 30)-(strx -30, stry + (page1 + 2) * linw) pp=pp+1 foot$= 第 +cstr(pp)+

27、 页 2) * linw+100, 10, foot$)打印页脚码printer.EndDoc 打印结束End sub 这种方法通过灵活的编程可以方便地调整字体、字型、 线形、页面、纸张大小等 ,可打印出比较满意的效果。如果计算机上装有 Microsoft Word 和 Microsoft Excel, 则可把 GR ID 的表格通过 VB 发送到这些应用程序中去 ,生成 Microsoft Word 和 Mic rosoft Excel 表格。这样可以充分利 用它们的打印、 编辑功能 ,打印出更理想的效果。 下面逐一介 绍。方法三 :通过生成 Word 表格打印1. 在 declaratio

28、n 中写入 :Dim msword As Object2. 加入打印命令按钮 (command2),CAPTION 设为 生 成 Word 表格 , 写入下面代码 :Pri vate Sub command2_Click()screen.MousePointer = 11Set msword = CreateObject(word.basic)Dim AppID, ReturnValueappID = Shell(d:/office97/office/WIN-WORD.EXE, 1)运 行Wordmsword.AppActivate Microsoft WordfullScreen.Mouse

29、Pointer = 0 End Sub3. 写入以下过程 full() Sub full()Dim i As Integer, j As Integer, col As Integer,row As IntegerDim cellcontent As StringMe.Hidecols = 4 表格的列数row = gridrow 打印表的行数 msword.filenewdefault msword.MsgBox 正在建立 MS_WORD 报表 ,请稍候H HH A,-1msword.leftparamsword.screenupdating 0msword.tableinserttable , col, row, , , 16, 167 m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论