編寫VB打印控制程序的幾點心得_第1頁
編寫VB打印控制程序的幾點心得_第2頁
編寫VB打印控制程序的幾點心得_第3頁
編寫VB打印控制程序的幾點心得_第4頁
編寫VB打印控制程序的幾點心得_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上Visual Basic(VB)給用戶提供了可視化編程環(huán)境,因其簡單易學(xué)、功能強大而得到了廣泛的應(yīng)用。VB提供了兩種實現(xiàn)打印的方法。一般在對打印質(zhì)量要求不高的場合,或者是編程項目的早期開發(fā)過程中,可以直接使用VB窗體的Printform方法實現(xiàn)打印。用這種方法實現(xiàn)打印具有編程簡單、易用并且功能強大的優(yōu)點,它只需要通過一行代碼,幾乎能打印所有內(nèi)容。實現(xiàn)的方法就是:首先將要打印的內(nèi)容在屏幕上顯示出來,然后開發(fā)人員只要為窗體對象激活   PrintForm ,窗體則自動將要打印的內(nèi)容發(fā)送到Printer對象上,其語法格式如下:窗體.PrintForm 。

2、如果窗體中包括圖形,那么打印前應(yīng)先置窗體的AutoRedraw屬性為真。這種方法雖然簡單,但是它卻存在著內(nèi)存消耗大、打印粗糙、速度慢等缺陷,尤其對于帶有滾動條的圖像,這種方法只能打印當前可視的區(qū)域 。在實際應(yīng)用中經(jīng)常會遇到對打印質(zhì)量要求很高的場合,例如打印音樂五線譜,對打印的美觀、清晰度以及音符符頭的位置都有很嚴格的要求,這種應(yīng)用場合若采用VB提供的另一種基于Printer對象的打印方法則可以獲得高分辨率的打印,得到很高的打印質(zhì)量。在實際應(yīng)用中,也可以根據(jù)實際應(yīng)用情況將上述兩種方法結(jié)合起來使用,即:前期工作使用PrintForm 簡單的打印方法將窗體的布局定下來,后期再使用基于Printer對

3、象的打印方法實現(xiàn)最終的打印工作。     2高分辨率打印程序開發(fā)心得     Printer對象     VB的打印可以使用Printer對象。Printer對象是一個獨立于打印機設(shè)備的封裝,它可以代表不同的打印機,初始時,Printer對象為系統(tǒng)缺省的打印機,也可以使用下列語句:Set   Printer=Printers(2) (其中2代表Printers集中的第二個打印機)對打印機進行指定。     Print

4、er對象具備例如:ColorMode、Copies、Duplex、Printquality等控制打印機特征的屬性, 提供了Newpage、EndDoc、KillDoc等控制打印過程的方法,以及大多數(shù)由窗體和圖片框控件提供的圖形屬性和方法如:Currentx、Currenty、Textwidth、Textheight、Print、Pset、Line、PaintPicture和Circle等方法,它還擁有Font的所有屬性。實現(xiàn)高分辨率的打印就是通過控制Printer對象的上述屬性和方法完成的。     直接利用Windows公用標準對話框CommonDia

5、log控件【打印】VB為用戶提供了Windows公用標準對話框CommonDialog控件:【打開】、【文件另存為】、【顏色】、【字體】、【打印】。CommonDialog控件在Visual Basic 和Microsoft Windows動態(tài)連接庫Commdlg.dll例程之間提供了接口。利用公用標準對話框【打印】開發(fā)VB的打印程序,將大大縮短程序的開發(fā)周期。應(yīng)用程序中要使用公用對話框,必須首先在工具箱中添加公用對話框控件。該動作通過激活【部件】對話框,選中Microsoft Common Dialog Control6.0, 單擊【確定】即可。然后再將公用控件添加到窗體上并設(shè)置相應(yīng)屬性,該

6、控件具有的屬性有Color、Font、Print、Help等。      VB提供mnuFilePrint_Click()過程供用戶添加開發(fā)的打印程序代碼。     Printer對象控制打印的基本過程     利用Printer對象開發(fā)的打印程序主要靠其提供的NewPage (打印新的一頁,CurrentX、CurrentY置為新頁的左上角,可完成多頁功能。)、EndDoc   (將打印任務(wù)加入打印機隊列)、KillDoc   (取消

7、打印任務(wù))控制打印過程的。一般情況下,打印程序完成多頁打印時會多次執(zhí)行NewPage,結(jié)束時執(zhí)行一次EndDoc將打印任務(wù)加入打印機隊列。如果你在NewPage后,立即使用EndDoc,VB則不會打印額外的空白頁。如果希望顯示空白頁,則可在新的一頁上只使用Printer.Print “   “打印空字符即可。為了通過Printer對象實現(xiàn)文本和圖形的打印,獲得最好的打印質(zhì)量,還需要對VB控制打印機的多種屬性有更深入的理解,例如打印機的坐標體系向屏幕坐標體系的轉(zhuǎn)換、打印機字體尺寸的確定等。下面給出了打印程序的主框架:Private Sub mnuFilePrint_Click

8、()     On Error Resume Next     If ActiveForm Is Nothing Then Exit Sub     With dlgCommonDialog             打印機公用對話框         .DialogTitle =

9、"打印"         .CancelError = True         .Flags = 1         Printer.FontSize = dlgCommonDialog.FontSize     將打印機公用對話框設(shè)置的字體大小傳遞給打印機   &#

10、160;     .ShowPrinter       在屏幕上顯示【打印】公用對話框         If Err <> MSComDlg.cdlCancel Then             Printer.FontTransparent = False   初始

11、化打印的字體為不透明             SetPrinterScale Myform     匹配打印機的縮放屬性與窗體的屬性             PrintAnywhere Printer         可放置用戶編寫的打印對

12、象參數(shù)化例程                                       實現(xiàn)字符和圖形的顯示Printer.NewPage      

13、0;    打印機坐標初始化PrintAnywhere Printer     打印另一頁的內(nèi)容Printer.NewPage           打印機坐標初始化             Printer.EndDoc       

14、0;       將該任務(wù)加入打印機任務(wù)隊列 不打印空白頁             Printer.KillDoc               取消當前的打印任務(wù)         End If

15、0;    End With   End Sub 參數(shù)化繪圖程序用VB開發(fā)應(yīng)用程序時,如果使用參數(shù)化繪圖例程進行屏幕顯示程序的開發(fā),則在開發(fā)打印程序時,就不需再另行開發(fā)代碼,從而避免了大量的重復(fù)勞動,有效地縮短了程序的開發(fā)周期。參數(shù)化繪圖例程就是:在開發(fā)例程時,為每一個例行程序提供一個OBJECT類型的參數(shù),調(diào)用程序通過向例程的OBJECT類型參數(shù)分別傳遞窗體、Printer對象,就可分別完成屏幕顯示與打印機輸出。 見如下示例:Sub   PrintAnywhere(Dest As Object)Dest.Print “HE

16、LLO!”Dest Is Printer Then         Printer.EndDocEnd IfEnd Sub要完成屏幕上的輸出,調(diào)用 PrintAnywhere Myform 即可,而調(diào)用 PrintAnywhere Printer則完成在打印機上輸出。 屬性匹配與窗體縮放因為控制打印機實際繪圖區(qū)域大小的屬性Height和Width,由目前正在使用的紙張決定,而且可打印的區(qū)域與紙張邊緣有一定距離。因而為了獲得正確的打印輸出結(jié)果,不能簡單地將Printer對象直接傳遞給繪圖例行程序,還必須要解決打印機的

17、縮放屬性與顯示窗體屬性相匹配的問題。即:保證使窗體中的打印內(nèi)容以正確的大小顯示,并居于可打印區(qū)域的中間。實際上實現(xiàn)的是打印機的坐標體系向屏幕坐標體系的轉(zhuǎn)換。具體過程是:使用打印機的ScaleX和ScaleY方法,獲取以twip為單位的打印機尺寸,再利用窗體的ScaleX和ScaleY方法將這些尺寸轉(zhuǎn)換為窗體中的坐標系統(tǒng),從而實現(xiàn)以窗體的坐標系統(tǒng)提供打印機可打印區(qū)域大小的目的。然后,用這些尺寸作為打印機中新的ScaleWidth和ScaleHeight,即可實現(xiàn)屬性匹配。但是,我們在打印時,經(jīng)常會遇到這樣的場合在不改變窗體形狀的情況下,需要擴大或縮小窗體的大小。要完成這樣的工作,不僅需要完成屬性

18、匹配,還要確定對象被縮放的系數(shù)。程序如下:Private Sub SetPrinterScale(obj As Object)Dim pwid As Single, phgt As Single, xmid As Single, ymid As SingleDim owid As Single, ohgt As Singleowid = obj.ScaleX(obj.ScaleWidth, obj.ScaleMode, vbTwips) ohgt = obj.ScaleY(obj.ScaleHeight, obj.ScaleMode, vbTwips)    &#

19、160;             獲取窗體以Twips表示的尺寸pwid = Printer.ScaleX(Printer.ScaleWidth, Printer.ScaleMode, vbTwips)phgt = Printer.ScaleY(Printer.ScaleHeight, Printer.ScaleMode, vbTwips)獲取打印機以Twips表示的尺寸If (ohgt / owid > phgt / pwid) Then  

20、60;  s = phgt / ohgtElse     s = pwid / owidEnd If         計算縮放因子pwid = obj.ScaleX(pwid, vbTwips, obj.ScaleMode) / sphgt = obj.ScaleY(phgt, vbTwips, obj.ScaleMode) / s           &#

21、160; 將打印機的尺寸轉(zhuǎn)換成obj的坐標系統(tǒng) / 縮放因子x_mid = obj.ScaleLeft + obj.ScaleWidth / 2y_mid = obj.ScaleTop + obj.ScaleHeight / 2設(shè)置打印區(qū)域的中心點坐標Printer.Scale (x_mid - pwid / 2, y_mid - phgt / 2)-(x_mid + pwid / 2, y_mid + phgt / 2)           設(shè)置打印機中新的ScaleWidth和ScaleHe

22、ightEnd Sub     坐標定位     窗體、圖片框控件以及Printer對象提供的TextWidth和 TextHeight方法在文本定位的應(yīng)用方面很有用。TextWidth、 TextHeight分別以對象當前的刻度單位返回字符串的寬度和高度。但是必須注意很多字體中其字符寬度并不全部相同,所以不能簡單地將單個字符的寬度乘以字符數(shù)來獲得字符串的寬度。對那些沒有TextWidth和TextHeight的控件可通過設(shè)置父窗體的Font屬性,使其與該控件的屬性相匹配,再利用父窗體的TextWidth和Text

23、Height獲得它的字符串的寬度和高度。但是,我們在完成屏幕顯示程序調(diào)試后,在進行打印輸出時卻出現(xiàn)了屏幕顯示與打印結(jié)果的不一致性的現(xiàn)象,表現(xiàn)在所打印的字體之間坐標關(guān)系與屏幕顯示不一樣,例如:屏幕顯示上的兩個字符不重疊,而打印出的字符卻出現(xiàn)相互重疊的現(xiàn)象。經(jīng)調(diào)試發(fā)現(xiàn),問題出現(xiàn)在字體尺寸的確定上。 程序中,屏幕上顯示的字符坐標是通過對象的TextWidth和TextHeight方法計算得來的,它直接受到字體尺寸大小的影響。VB向用戶提供的字體是在用戶需要的打印機點的范圍內(nèi),如果你需要的字體大小為73點, 則打印出的實際字體大小為72.75。然而窗體、圖片框控件的Fontsize只能是整數(shù),例如它不

24、能將字體的大小定為72.75,實際上這就造成了屏幕上顯示字體與實際打印字體大小之間產(chǎn)生了誤差。 我們采用如下方法來解決該問題,就是在計算字體大小時,根據(jù)計算出來的字體尺寸,確定它存在的范圍,然后再將它定位到VB提供的幾種固定大小的字體上,而不是隨意指定。當然,也可以有其它的解決辦法。例如:字體大小選取偶數(shù)等。 由于篇幅所限,這里不再作介紹。VB中Grid控件的打印方法Grid控件是Visual Basic(以下簡稱VB)最常見控件之一,用它可以以表格的形式顯示、瀏覽數(shù)據(jù)。特別是在數(shù)據(jù)庫應(yīng)用中,直接綁定即可顯示和瀏覽數(shù)據(jù)庫信息。然而,美中不足的是Grid沒有編輯和打印功能,列與列的位置不能相互交

25、換。筆者曾嘗試著給Grid增添了這些功能,使之功能更強大。下面給出改進方法及源程序,讀者可參考使用。該程序在HP5/100、Window 95環(huán)境下用VB5.0調(diào)試通過。 給Grid 控件增加打印方法有三種:一是直接打印控件,二是通過p rinter 來實現(xiàn)打印功能,三是通過調(diào)用MS-Word及MS-Excel 來實現(xiàn)打印。 首先,打開一個應(yīng)用,在FORM1中增加DATA控件DATA1,把DATA1的CO NNECT屬性設(shè)為dBA SE,再把DATABASENAME屬性設(shè)為D:PJXM.DBF。然后再在FORM1中增加MSFLEXGRID控件GRID1,并把GRID1的DATASOURCE 屬

26、性設(shè)為DATA1。這樣數(shù)據(jù)庫PJXM.DBF的信息就會在GRID1 中顯示出來。下面分析介紹各種打印方法。 方法一:直接打印窗體 在FORM1中增加命令按鈕(command),CAPTION屬性設(shè)為直接打印, 再寫入下列代碼: Sub command_click Form1.printform End sub 這樣即可通過打印窗體FORM1的方法把GRID1的數(shù)據(jù)打印出來。這種方法的缺點是只能打印GRID1中顯示的數(shù)據(jù)部分,顯示不出來的則無法打印,而且這種打印方法很像屏幕硬拷貝,而且不能靈活地控制字體等。 方法二:通過PRINTER實現(xiàn)打印 1. 加入打印命令按鈕(command1)和函數(shù)(p

27、rnt1),寫入下面代碼, 讀者稍加改動可寫成標準的函數(shù)或過程。color=#0000a0Function prnt1 (x As Int eger, y As Integer, font As Sing le, txt As String) printer.CurrentX = x printer.CurrentY = y printer.FontBold = False printer.FontSize = font printer.Print txt End Function Sub command1_click Dim fnt As Single Dim pp as integer P

28、p=0 '設(shè)置開始頁碼0 Dim stry,strx,strx1,stry1,linw,page1,p As Integer Static a(8) As Integer '定義打印的列數(shù) ss$ = "內(nèi)部結(jié)算存入款對帳單" '定義表頭 kan = 0 For i = 0 To 8 a(i) = 1500' 定義每列寬 kan = kan + a(i) '計算表格總寬度 Next page1 = 50 定義每頁行數(shù) strx = 200 strx1 = 200 定義X方向起始位置 stry = 1400 stry1 = 1400 定

29、義Y方向起始位置 linw = 240 定義行寬 fnt = 8 定義字體大小 printer.fontname = "宋體" 定義字體 dd = prnt1(4000, 700, 18, ss$) 打印標題 printer.Line (strx - 50, stry - 30)-(strx + kan - 10, stry - 30) For j = 0 To gridrow - 1 gridrow為所要打印的行數(shù) grid1.row = j strx = strx1 printer.Line (strx - 50, stry - 30)-(strx + kan - 10

30、, stry - 30) p = p + 1 For i = 0 To 8 grid1.col = i dd = prnt1(strx, stry, fnt, grid1.text) strx = strx + a(i) Next If p > page1 Then next page p = 0 strx = strx1 printer.Line (strx - 50, stry + linw)-(strx + kan - 10, stry + linw) stry = stry1 For n = 0 To 8 printer.Line (strx - 30, stry - 30)-(

31、strx - 30, stry + (page1 + 2) * linw) strx = strx + a(n) Next printer.Line (strx - 30, stry - 30)-(strx - 30, stry + (page1 + 2) * linw) pp=pp+1 foot$="第 "+cstr(pp)+" 頁" dd = prnt1(strx - 30-1000, stry + (page1 + 2) * linw+100, 10, foot$) 打印頁腳碼 printer.NewPage next page dd = prnt

32、1(4000, 700, 18, ss$) 打印標題 strx = strx1 stry = stry1 printer.Line (strx - 50, stry - 30)-(strx + kan - 10, stry - 30) 打印第一行 Else stry = stry + linw End IfNext st = stry If p < page1 Then 在最后頁剩余劃空行 For o = p To page1 + 1 strx = strx1 printer.Line (strx - 50, stry - 30)-(strx + kan - 10, stry - 30)

33、 stry = stry + linw Next End If stry = stry1 strx = strx1 stry = stry1line col For n = 0 To 8 printer.Line (strx - 30, stry - 30)-(strx - 30, stry + (page1 + 2) * linw) strx = strx + a(n) Next printer.Line (strx - 30, stry - 30)-(strx - 30, stry + (page1 + 2) * linw) pp=pp+1 foot$="第 "+cst

34、r(pp)+" 頁" dd = prnt1(strx - 30-1000, stry + (page1 + /color2) * linw+100, 10, foot$)打印頁腳碼 printer.EndDoc打印結(jié)束 End sub 這種方法通過靈活的編程可以方便地調(diào)整字體、字型、線形、頁面、紙張大小等,可打印出比較滿意的效果。 如果計算機上裝有Microsoft Word和Microsoft Excel,則可把GR ID的表格通過VB發(fā)送到這些應(yīng)用程序中去,生成Microsoft Word和Mic rosoft Excel表格。這樣可以充分利用它們的打印、編輯功能,打印

35、出更理想的效果。下面逐一介紹。 方法三:通過生成Word表格打印 1. 在declaration 中寫入: Dim msword As Object 2. 加入打印命令按鈕(command2),CAPTION設(shè)為"生成Word表格", 寫入下面代碼:Pri vate Sub command2_Click() screen.MousePointer = 11 Set msword = CreateObject("word.basic") Dim AppID, ReturnValue appID = Shell("d:office97officeW

36、IN- WORD.EXE", 1) 運行Word msword.AppActivate "Microsoft Word" full Screen.MousePointer = 0End Sub 3. 寫入以下過程full()Sub full() Dim i As Integer, j As Integer, col As Integer, row As Integer Dim cellcontent As String Me.Hide cols = 4表格的列數(shù) row = gridrow 打印表的行數(shù) msword.filenewdefault msword.MsgBox &quo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論