Windows程式大多數具有“所見即所得 (WYSIWYG)”(WYSIWYG,What You See Is What You Get)的功能。“所見即所得 (WYSIWYG)”是指軟體列印輸出效果和螢幕顯示效果完全一致。“所見即所得 (WYSIWYG)”是Windows程式的一個主要優點之一。
本文將介紹如何使用Visual BASIC(以下簡稱VB)編寫具有“所見即所得 (WYSIWYG)”功能的Windows程式。
一、方法概述
為了在螢幕上類比列印效果,我們使用VB的一個表單來類比一張列印紙。在VB中,每一個表單都有一個PrintForm方法。使用PrintForm方法可以把一個表單的內容完全一樣地通過印表機列印出來。由於PrintForm方法在列印表單內容的時候,對於表單內的文字和圖形都是同樣地列印。所以通過簡單的編程,使用PrintForm方法可以非常方便地實現圖文混合列印。
①確定使用者可以使用的顯示與列印雙功能字模
“所見即所得 (WYSIWYG)”程式中使用者可以使用的字模必須是同時支援Windows的顯示裝置和列印裝置的雙功能字模。只有這些字模才可以在螢幕和印表機上產生一樣的效果。因此,程式必須首先獲得這些顯示與列印雙功能字模的名稱。
②在螢幕上設定“紙張”表單的大小
通過讀取Windows列印管理器紙張尺寸的設定,在VB裡建立一個與列印紙具有同樣尺寸比例關係的表單,作為螢幕上類比列印效果的“紙張”,讓使用者在螢幕上就可以看到文字和圖形在列印紙上的位置分布。
③使用者在螢幕“紙張”上類比列印效果
在類比列印的表單中通過使用Print、Line、Circle等方法繪製文字和圖形的,還可以使用圖形框、Graph.VBX、OLE等控制項繪製圖形、統計圖表、公式、藝術字型等。
④將螢幕“紙張”的內容輸出到印表機
使用表單的PrintForm方法把第③步所繪製的文字和圖形輸出到印表機,得到和螢幕顯示一模一樣的列印拷貝,實現“所見即所得 (WYSIWYG)”。
二、印表機字模和顯示器字模的精確匹配
Windows的字模分為兩類:印表機字模和顯示器字模。各種TrueType字模(如宋體、黑體字模)都是顯示與列印雙功能字模。其他的非TrueType字模就只能用於顯示或列印。
如果在類比列印表單的文字輸出中使用了只能用於顯示的字模,那麼當PrintForm方法執行的時候,Windows就只能在列印字模中尋找一個盡量和這個顯示字模字型匹配的字模來進行列印。這樣將導致得到的列印拷貝與螢幕顯示不一致。
為了使程式獲得“所見即所得 (WYSIWYG)”的能力,必須在表單輸出中使用顯示與列印雙功能字模。因此,程式獲得“所見即所得 (WYSIWYG)”能力的一個關鍵是:確保在螢幕輸出中只使用顯示與列印雙功能字模。
在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