编写VB打印控制程序的几点心得
⑷ 参数化绘图程序
用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