求VB打印相关的东东
我是一个菜鸟,想做一个监测其它软件的打印内容,并对其进行更改,而后以相同格式打印出来,那位大侠能给提个思路啊,最好能有源码,不胜感激。
没看懂楼主的意思,不过看一下东东能帮上不?
1.简介
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.EndDoc
End If
End 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 Single
Dim owid As Single, ohgt As Single
owid = 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 / ohgt
Else
s = pwid / owid
End 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 / 2)-(x_mid + pwid / 2, y_mid + phgt / 2)
‘ 设置打印机中新的ScaleWidth和ScaleHeight
End Sub
⑹ 坐标定位
窗体、图片框控件以及Printer对象提供的TextWidth和 TextHeight方法在文本定位的应用方面很有用。TextWidth、 TextHeight分别以对象当前的刻度单位返回字符串的宽度和高度。但是必须注意很多字体中其字符宽度并不全部相同,所以不能简单地将单个字符的宽度乘以字符数来获得字符串的宽度。对那些没有TextWidth和TextHeight的控件可通过设置父窗体的Font属性,使其与该控件的属性相匹配,再利用父窗体的TextWidth和TextHeight获得它的字符串的宽度和高度。
但是,我们在完成屏幕显示程序调试后,在进行打印输出时却出现了屏幕显示与打印结果的不一致性的现象,表现在所打印的字体之间坐标关系与屏幕显示不一样,例如:屏幕显示上的两个字符不重叠,而打印出的字符却出现相互重叠的现象。经调试发现,问题出现在字体尺寸的确定上。程序中,屏幕上显示的字符坐标是通过对象的TextWidth和TextHeight方法计算得来的,它直接受到字体尺寸大小的影响。VB向用户提供的字体是在用户需要的打印机点的范围内,如果你需要的字体大小为73点,则打印出的实际字体大小为72.75。然而窗体、图片框控件的Fontsize只能是整数,例如它不能将字体的大小定为72.75,实际上这就造成了屏幕上显示字体与实际打印字体大小之间产生了误差。 我们采用如下方法来解决该问题,就是在计算字体大小时,根据计算出来的字体尺寸,确定它存在的范围,然后再将它定位到VB提供的几种固定大小的字体上,而不是随意指定。当然,也可以有其它的解决办法。例如:字体大小选取偶数等。由于篇幅所限,这里不再作介绍。
以上是笔者在总结实际应用工作中的一些心得与体会,希望本篇文章能对首次使用VB开发打印程序的设计人员有所帮助。
参考文献
1、Rod Steprhens Visual BasicTM Graphics Programming
2、温志华王显文 徐强 ·Visual Basic 6.0 多媒体实用编程技术· 1999
3、张树兵等·Visual Basic 6.0中文版入门与提高·清华大学出版社,1999
===============================
一、采用Visual Basic提供简单的打印函数PrintForm方法
应用程序窗体的PrintForm方法时,Visual Basic把窗体的位图送到当前打印机。该方法的优点在于它几乎不需要任何编程,但也有很大缺陷。最为突出的是当低分辨率图形在高分辨率打印机上打印时,其结果令人无法满意,会产生锯齿。下面代码将在打印机上打印窗体。
Private Sub Command1_Click() 注释:用PrintForm打印
Me.PrintForm 注释:打印窗体的可见区域
End Sub
二、用Printer对象
用Printer对象可以进行高分辨率输出,但要想产生复杂的打印输出,编程较为繁琐。Printer对象代表系统确省的打印机。Printer对象支持许多由窗体和图形框所支持的属性和方法,三种对象都有画线和画方框。应用程序可用以下列代码在Printer对象上画出一平方英寸的方框。它离左上角二英寸。注意:打印机以twips来测量距离。每英寸有1440个twips。
Printer.Line(2*1440,2*1440)-Step(1440,1440), ,B
---- 打印机、从窗体和图形框都有Circle、PaintPicture、Print、Pset、TextHeight、TextWidth方法。使用这些方法,应用程序可以为打印机生成高分辨率输出。
---- 打印文本直接用Print方法,见下列代码:
---- Printer.Print “Hello,China ComputerWorld!” ‘打印字符串
---- Printer对象还有一些窗体和图形框都没有方法:
---- NewPage告诉打印机,程序对当前输出页的发送已经结束。Printer对象应开始新的一页。
---- EndDoc告诉VISUAL BASIC,程序创建文档结束。VISUAL BASIC应将它发送到物理打印机上打印。
---- KillDoc取消当前打印作业。应用程序应该终止由EndDoc和KillDoc所设定的每个打印作业。
---- Zoom属性用于定义打印输出的缩放因子。
---- Copies属性用于定义打印的副本数目。
三、采用直接将数据传送打印机的方法进行打印输出
该方法也不太实用。有两种方法将数据送往打印机。第一种是用Print # 方法,就象将数据写入一个文件一样写数据。另一种方法写端口,但不是送文本,而是送特定的PCL语言,PCL表示打印控制语言(Print Control Language)。它是一种特殊语言,用转义代码来控制打印机的具体动作。因为此方法太繁琐,本文不做太多介绍,见谅。
四、使用RichTextBox控件的SelPrint方法
如果你在编程时用到了RichTextBox控制,那么你可以使用该控件的SelPrint 方法来打印,使用非常简单。下面一段代码即用RichTextBox控件的SelPrint 方法来完成打印。
Private Sub Command3_Click() 注释:SelPrint方法
CommonDialog1.Flags = cdlPDReturnDC + cdlPDNoPageNums
If RTF1.SelLength = 0 Then注释:RTF1为窗体的RichTextBox控制
CommonDialog1.Flags = CommonDialog1.Flags + cdlPDAllPages
Else
CommonDialog1.Flags = CommonDialog1.Flags + cdlPDSelection
End If
CommonDialog1.CancelError = True
On Error Resume Next
CommonDialog1.ShowPrinter
If Err.Number = cdlCancel Then Exit Sub
If Err.Number < > 0 Then
Beep
MsgBox "Error printing file.
" & vbCrLf + Err.Description, vbOKOnly + vbExclamation,
"Printing Error!"
Exit Sub
End If
Printer.Print ""
RTF1.SelPrint CommonDialog1.hDC 注释:
打印RTF1控件的可见区域
End Sub
上面代码先进行打进设置,再进行打印。如果不需要设置,采用下面代码更为简单。
RTF1.SelPrint Printer.hDC 注释:打印RTF1控件的可见区域
五、可以在VB中调用Word 97提供的OLE自动化服务
利用Word 97强大的打印功能来完成VISUAL BASIC打印,笔者认为这是最令人满意的方法。下面代码说明VB如何与Word集成。
Private Sub Command4_Click() 注释:调用Word打印
Dim objWord As Object
Const CLASSOBJECT = "Word.Application"
On Error GoTo objError
Set objWord = CreateObject(CLASSOBJECT)
objWord.Visible = True
objWord.Documents.Add
With objWord
.ActiveDocument.Paragraphs.Last.Range.Bold = False
.ActiveDocument.Paragraphs.Last.Range.Font.Size = 20
.ActiveDocument.Paragraphs.Last.Range.Font.Name = "黑体"
.ActiveDocument.Paragraphs.Last.Range.Font.ColorIndex = 4
.ActiveDocument.Paragraphs.Last.Range.Text =
"我是计算机世界读者!"
End With
Clipboard.Clear
Clipboard.SetText "通过剪切板向WORD传送数据!"
objWord.Selection.Paste
objWord.PrintPreview = True 注释:预览方式
注释:objWord.PrintOut注释:执行打印
注释:objWord.Quit注释:退出Word
Exit Sub
objError:
If Err < > 429 Then
MsgBox Str$(Err) & Error$
Set objWord = Nothing 注释:不能创建Word对象则退出
Exit Sub
Else
Resume Next
End If
End Sub
六、用VC编制DLL模块完成打印
在VISUAL BASIC中调用该模块的混合编程的方法进行打印输出。因涉及VC编程比较繁琐,因篇幅问题这里不再讨论,但可以肯定用VC编制的打印将更具特色。