VB中实现“所见即所得”功能

来源:百度文库 编辑:神马文学网 时间:2024/04/28 21:15:48
作者: 王锋
来源:www.ccidnet.com
Windows程序大多数具有“所见即所得”(WYSIWYG,What You See Is What You Get)的功能。“所见即所得”是指软件打印输出效果和屏幕显示效果完全一致。“所见即所得”是Windows程序的一个主要优点之一。
本文将介绍如何使用Visual BASIC(以下简称VB)编写具有“所见即所得”功能的Windows程序。
一、方法概述
为了在屏幕上模拟打印效果,我们使用VB的一个窗体来模拟一张打印纸。在VB中,每一个窗体都有一个PrintForm方法。使用PrintForm方法可以把一个窗体的内容完全一样地通过打印机打印出来。由于PrintForm方法在打印窗体内容的时候,对于窗体内的文字和图形都是同样地打印。所以通过简单的编程,使用PrintForm方法可以非常方便地实现图文混合打印。
①确定用户可以使用的显示与打印双功能字模
“所见即所得”程序中用户可以使用的字模必须是同时支持Windows的显示设备和打印设备的双功能字模。只有这些字模才可以在屏幕和打印机上产生一样的效果。因此,程序必须首先获得这些显示与打印双功能字模的名称。
②在屏幕上设置“纸张”窗体的大小
通过读取Windows打印管理器纸张尺寸的设置,在VB里建立一个与打印纸具有同样尺寸比例关系的窗体,作为屏幕上模拟打印效果的“纸张”,让用户在屏幕上就可以看到文字和图形在打印纸上的位置分布。
③用户在屏幕“纸张”上模拟打印效果
在模拟打印的窗体中通过使用Print、Line、Circle等方法绘制文字和图形的,还可以使用图形框、Graph.VBX、OLE等控件绘制图形、统计图表、公式、艺术字型等。
④将屏幕“纸张”的内容输出到打印机
使用窗体的PrintForm方法把第③步所绘制的文字和图形输出到打印机,得到和屏幕显示一模一样的打印拷贝,实现“所见即所得”。
二、打印机字模和显示器字模的精确匹配
Windows的字模分为两类:打印机字模和显示器字模。各种TrueType字模(如宋体、黑体字模)都是显示与打印双功能字模。其他的非TrueType字模就只能用于显示或打印。
如果在模拟打印窗体的文字输出中使用了只能用于显示的字模,那么当PrintForm方法执行的时候,Windows就只能在打印字模中查找一个尽量和这个显示字模字型匹配的字模来进行打印。这样将导致得到的打印拷贝与屏幕显示不一致。
为了使程序获得“所见即所得”的能力,必须在窗体输出中使用显示与打印双功能字模。因此,程序获得“所见即所得”能力的一个关键是:确保在屏幕输出中只使用显示与打印双功能字模。
在VB中提供了两个全局对象:屏幕对象Screen和打印机对象Printer。两个对象都提供了FontCount属性和Fonts属性。FontCount属性提供了可使用字模的数量,而Fonts属性提供了可使用字模的名称。在程序中,我们可以取出Screen对象和Printer对象所共同拥有的字模,这些字模就是所有的显示与打印双功能字模。
具体的程序如下:
首先设置一个列表框,取名List1,然后调用下面的GetFont函数,在List1中就存放所有显示与打印双功能字模的名称。
Sub GetFont()
For i=0 To Screen.FontCount-1
For j=0 To Printer.FontCount-1
If Screen.Fonts(i)=Printer.Fonts(j) Then
List1.Add1tem (Sereen.Fonts(i))
End If
Next j
Next i
End Sub
三、窗体大小和纸张尺寸的匹配
为了在屏幕上可以清楚地看到文字和图形在打印纸上的位置和大小关系,必须使VB显示窗口的大小比例和打印纸张的大小比例是一致的。打印纸张的大小可以使用Printer对象的Width和Height属性来获得。根据获得的属性值可以设置VB显示窗体的大小比例,使之合乎纸张的比例大小。
下面的程序中有一个变量Size,其取值的范围为0-1。它的作用是控制打印图形的大小。当Size的值为1的时候,打印图形将和Windows设定的纸张一样大小。具体程序如下:
Sub Form_Load ()
Dim SizeAS INTECER
Size=0.95
Form1.Height=Printer.Height*Size
Form1.Wdth=Printer.Width*Size
End Sub
四、模拟打印和打印输出
下面的一段程序演示了在显示窗体上模拟打印文字和图形的方法,以及使用PrintForm把显示窗体中的文字和图形输出到打印机的方法。
注意的是:为了使用PrintForm方法,必须把显示窗体的AutoRedraw属性设置为True。
由于PrintForm方法打印窗体的内容是使用bit-by-bit的拷贝方法,因此在窗体里的所有文字和图形都可以被原样打印出来。作为例子,我们可以使用OLE控件来显示Word公式编辑器里编辑的公式,使用Picture和Graph控件来显示图形和统计图。然后使用PrintForm方法将它们打印出来。
具体程序如下:
Sub PrintOnScreen ()
Form1.Scale(0,0)-(100,100) ' 设置坐标
Form1.Line(100,0)-(0,100) ' 显示画线
Form1.CurrentX=0
Form1.CurrentY=0
Form1.FontName="宋体" ' 输出文字
Form1.FontSize=20
Form1.Print "模拟打印"
Picture1.Picture=LoadPicture("setup.bmp") '输出图形
Form1.PrintForm ' 将显示窗体的内容送到打印机
Printer.EndDoc ' 开始打印
End Sub