none
使用VB实现所见即所得功能 RRS feed

  • 常规讨论

  • 通过读取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.AddItem (Screen.Fonts(i))

    End If

    Next j

    Next i

    End Sub


    三、窗体大小和纸张尺寸的匹配


      为了在屏幕上可以清楚地看到文字和图形在打印纸上的位置和大小关系,必须使VB显示窗口的大小比例和打印纸张的大小比例是一致的。打印纸张的大小可以使用Printer对象的Width和Height属性来获得。根据获得的属性值可以设置VB显示窗体的大小比例,使之合乎纸张的比例大小。


      下面的具体程序中有一个变量Size,其取值的范围为0-1。它的作用是控制打印图形的大小。当Size的值为1的时候,打印图形将和Windows设定的纸张一样大小。具体程序如下:


    Private Sub Form_Load()

    Dim Size As INTECER

    Size = 0.95

    Form1.Height = Printer.Height * Size

    Form1.Width = 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("3d.wmf") '输出图形

    Form1.PrintForm '将显示窗体的内容送到打印机

    Printer.EndDoc '开始打印

    End Sub
    2009年5月27日 8:37