top
Loading...
VisualBasic應用程序的幾種打印方法
打印是編制應用程序過程中最復雜的事情之一,不同的打印機提供了各種不同的功能。編寫能充分利用打印機性能的子程序與編寫應用程序的其它部分一樣都很困難。慶幸的微軟的Windows平臺使打印工作變得相對容易了。

最近,筆者編制出一套綜合試題庫管理系統,完成試題的編輯、自動組卷及打印試卷等工作,在編程時,也碰到了打印問題,筆者找到了幾種打印方法,現將它們整理出來,以飧讀者,希望能給您的工作提供一點方便。

一、采用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編制的打印將更具特色。

筆者的試題庫采用的是第五和第六兩種方案,如果機器上沒有Word ,就調用DLL打印模塊。打印是編程工作中重要的一部分,總的來說,微軟已經使打印變得極為簡便,但還要我們做一些必須的工作。希望本文能夠拓展你編程的思路,編出更好的應用程序。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗