付費下載
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、(1)假設(shè)你的 MONDIAL??丶?CMDiag用如下代碼可以使你選擇的打印機成為默認打印機 OnError Resume NextCMDiag.PrinterDefault = True CMDiag.CancelError =True CMDiag.ShowPrinterIf Err.Number 0 Then Exit SubPrinter(2)VB里面,原本改變預(yù)設(shè)打印機的方法是:(假設(shè)安裝有兩種打印機 ( 驅(qū)動程式 )SetSetPrinterPrinterPrinters(0)Printers(1)將預(yù)設(shè)打印機設(shè)定成第一種打印機 將預(yù)設(shè)打印機設(shè)定成第二種打印機但實際上以上敘述有
2、時候不會成功 (原因不詳 ) , 以下是呼叫 Windows API 的方法: (為了能夠成功地改變預(yù)設(shè)打印機,此一解決方案適用於Windows95,98)1.ConstConstAPI的宣告:HWND_BROADCAST =WM_WININICHANGE&HFFFF&H1APrivateDeclareFunctionGetProfileStringLibkernel32AliasGetProfileStringA(ByVallpAppName As String,ByVal lpKeyNameAsString,ByVallpDefaultAsString,ByVallpRet
3、urnedStringAsString,ByVal nSizeAsLong)AsLongPrivateDeclareFunctionWriteProfileStringLibkernel32AliasWriteProfileStringA(ByVallpszSectionAsString,ByVal lpszKeyNameAs String,ByVallpszStringAs String)As LongPrivateA _DeclareFunctionSendMessage Libuser32AliasSendMessage(ByValLong,lParamhwndAsLong,ByValw
4、MsgAsLong,ByValwParamAsAsAny)AsLong2. 程式范例:PrinterNameDimS As 您想設(shè)定的打印機名稱 String, lengthAsLong,hKeyAsLongSlengthSCallString(80, Chr(0)=GetProfileString(devices,Left(S,length)WriteProfileString(windows,PrinterName,device,HHS,Len(S)PrinterNameS)Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, &H7F
5、FF&,ByValwindows)至於改變 NT 預(yù)設(shè)打印機的方法, 在登錄資料庫中紀錄預(yù)設(shè)打印機的 ValueHKEY_CURRENT_USERSoftwareMicrosoftWindowsNTCurrentVersionWindows是:則是改變登錄資料庫 (Registry)打印機的設(shè)定,subkey的 Device value0&)(3)VB中獲取指定打印機的各種紙張類型及大小放入一個OptionPrivatePrivatePrivatePrivatePrivatePrivateMSFlexGrid,名稱為fgd1,ExplicitConstConstConstCon
6、stConstDeclare列數(shù)為4viceCapabilitiesAg, ByVal iIndexPrivate TypeDC_MAXEXTENT=DC_MINEXTENT= DC_PAPERNAMES= DC_PAPERS= 2 DC_PAPERSIZE =Function DeviceCapabilities Lib winspool.drv Alias (ByVallpDeviceName As String, ByVal lpPort As As Long, lpOutput As Any, lpDevModeAs Any) As POINTSxAsyAs54163DeviceCap
7、abilitiesDeStrinLongLongLongEnd TypePrivateDimWithSubi As Longfgd1.ClearForm_Load()八紙張編號廣紙張名稱廣紙張長度廣紙張寬度”.Cols - 1 .ColWidth(i) =1700Next i.AllowUserResizing =.Left = 0.FormatString =For i = 0 ToflexResizeColumns.Width = Me.ScaleWidthWithEndGetPaperInfo End SubPrivate Sub GetPaperInfo() Dim i As Long
8、, retAs Dim Length As Integer, Dim PaperNo() AsInteger, 支持最大打印紙:ret =DeviceCapabilities(稱, LPT1,DC_MAXEXTENT, ByVal Length = ret 65536Width = ret - Length * 65536lblMaxLength.Caption = LengthlblMaxWidth.Caption = Width 支持最小打印紙:ret = DeviceCapabilities(稱,LPT1, DC_MINEXTENT, ByValLength = ret 65536 Wi
9、dth = ret - LengthLongWidth As IntegerPaperName() As打0&, ByVal打0&, ByVal65536String,印0&)印PaperSize() AsPOINTS支持紙張種類數(shù)ret = DeviceCapabilities(0&)稱,LPT1, DC_PAPERS, ByVal 0&, ByVal紙張編號ReDim PaperNo(1 To ret) As Integer CallDeviceCapabilities(打稱, LPT1, DC_PAPERS, PaperNo(1), ByVal 紙
10、張名稱Dim arrPageName()DimDimAs Byte allNames As StringlStart As Long, lEnd0&)印0&)LongString64) As Byte打DC_PAPERNAMES,arrPageName(1),ReDim PaperName(1 To ret) ReDimarrPageName(1 To retCall DeviceCapabilities(稱,LPT1, allNames = loop i = DoAsAs印ByVal 0&)StrConv(arrPageName,andthrough the stri
11、ng1vbUnicode)search forthe namesof the papers1)lEndIf= InStr(lStart(lEnd 0) AndPaperName(i)+(lEnd - lStartMid$(allNames,1, allNames,Chr$(0),- 1 lStartvbBinarypare)0) Then+ 1, lEndlStartEndlStart UntiliIf= lEndlEnd = 0Loop 紙張尺寸ReDim PaperSize(1 To ret)Call DeviceCapabilities(Form2.bo1.Text,ByVal 0&am
12、p;) 顯示在表格中For i = 1 To retfgd1.AddItem PaperNo(i) & vbTab & PaperName(i) & vbTab & Paper Size(i).y & vbTab &PaperSize(i).xNext iAs POINTSLPT1,DC_PAPERSIZE, PaperSize(1),移除第一個空行fgd1.Row = 1fgd1.RemoveItem 1End SubPrivateWithEndEndSub Form_Resize()fgd1.Left = 0.Width = Me.Scale
13、Width .Height =Me.ScaleHeight .Top = 0WithSub編寫VB打印控制程序的幾點心得摘 要 本文在總結(jié)作者實際開發(fā)經(jīng)驗的基礎(chǔ)上,詳細介紹了VB實現(xiàn)高分辨率打印方法的幾點心得。闡述了參數(shù)化繪圖程序縮短打印程序開發(fā)時間的方法以及打印機縮 放屬性與窗體屬性匹配使用的技巧, 并總結(jié)了解決坐標定位、圖形與其實際打印 位置出現(xiàn)誤差等問題的經(jīng)驗。關(guān)鍵詞PrintForm高分辨率打印參數(shù)化繪圖縮放屬性Some Exp erie nces on VB Print Con trolBai Yang, Wang Pengpu ter Scie nee Dep artme ntUn
14、i versity of In formati on and Engin eeri ngZhen gzhou, ChinaAbstract:On the basisof our workingexperiences, wedescriptionabout VBprint method of high resolution.devel oping p eriod attribute and the attribute of dis play win dow etc.,which based on printp rogram of Prin ter Object .In additi on to
15、this, we have in troduced some exp erie nces on dealing with po siti on error that caused by the mismatch betwee n font and graph on scree n and thaton prin ter.Keywords:Prin tForm, High Resoluti on Print, p arameterized plot attribute 1簡介Visual Basic(VB)給用戶提供了可視化編程環(huán)境,因其簡單易學(xué)、功能強大而得到了廣泛的應(yīng)用。VB提供了兩種實現(xiàn)打
16、印的方法。一般在對打印質(zhì)量要求不高的場合,或者 是編程項目的早期開發(fā)過程中,可以直接使用VB窗體的Printform方法實現(xiàn)打印。用這種方法實現(xiàn)打印具有編程簡單、易用并且功能強大的優(yōu)點,它只需要通過一行代碼,幾乎能打 印所有內(nèi)容。實現(xiàn)的方法就是:首先將要打印的內(nèi)容在屏幕上顯示出來,然后開發(fā)人員只要為窗體對象激活PrintForm,窗體則自動將 要打印的內(nèi)容 發(fā)送到Printer對象上,其語法格式如下:窗體.PrintForm。如果窗體中包括圖形,那么打印前應(yīng)先置窗體的AutoRedraw屬性為真。這種方法雖然簡單,但是它卻存在著內(nèi)存消耗大、打印粗糙、 速度慢等缺陷,尤其對于帶有滾動條的圖像,這
17、種方法只能打印當(dāng)前可視的區(qū)域。在實際應(yīng)用中經(jīng)常會遇到對打印質(zhì)量要求很高的場合,例如打印 音樂五線譜,對打印的美觀、清晰度以及音符符頭的位置都有很嚴格的要求,這種應(yīng)用場合若采用VB提供的另一種基于Prin ter對象的打印方法則可以獲得高分辨率的打印,得到很高的打印質(zhì)量。在實際應(yīng)用中,也可以根據(jù)實際應(yīng)用情況將上述兩種方法結(jié)合起來使用,即:前期工作使用Prin tForm簡單的打印方法將窗體的布局定下來,后期再使用基于Printer對象的打印方法實現(xiàn)最終的打印工作。2.高分辨率打印程序開發(fā)心得Printer對象have give n a detail Wefocuson how to shorte
18、n with p arameterized plot p rogram, the match betwee n thezoom,zoomVB的打印可以使用Prin ter對象。Prin ter對象是一個獨立于打印機設(shè)備的封裝,它 可以代表不同的打印機,初始時,Printer對象為系統(tǒng)缺省的打印機,也可以使用下列語句:SetPrinter= Printers(2)(其中2代表Printers集中的第二個打印機)對打印機進行指定。Printer對象具備例如:ColorMode、Copies、Duplex、Printquality等控制打印機特征的屬性,提供了New page En dDoc Kil
19、lDoc等控制打印過程的方法,以及大多數(shù)由窗體和圖片框控件提供的圖形屬性和方法如:Currentx、Currenty、Textwidth、Textheight、Print、Pset、Line、PaintPicture和Circle等方法,它還擁有Font的所有屬性。實現(xiàn)高分辨率的打印就是通過控制Prin ter對象的上述屬性和方法完成的。直接利用Win dows公用標準對話框mon Dialog控件【打印】VB為用戶提供了【顏色】、【字體】、動態(tài)連接庫mdlg.dll序,將大大縮短程序的開發(fā)周期。公用對話框控件。該動作通過激活【部件】對話框,選中Microsoft單擊 【確定】 即可。 然后再
20、將公用控件添加到窗體上并設(shè)置相應(yīng)屬性, 該控件具有的屬性有Color、Font、Print、Help等。VB提供mnuFilePrint_Click()過程供用戶添加開發(fā)的打印程序代碼。Prin ter對象控制打印的基本過程利用Prin ter對象開發(fā)的打印程序主要靠其提供的一一New Page(打印新的 一頁,CurrentX、CurrentY置為新頁的左上角, 可完成多頁功能。 ) 、EndDoc(將 打印任務(wù)加入打印機隊列) 、KillDoc(取消打印任務(wù))控制打印過程的。一般情況下,打印程序完成多頁打印時會多次執(zhí)行New Page結(jié)束時執(zhí)行一次En dDoc將打印任務(wù)加入打印機隊列。如
21、果你在New Page后,立即使用En dDocVB則不會打印額外的空白頁。如果希望顯示空白頁,則可在新的一頁上只使用Printer.Print“打印空字符即可。為了通過Printer對象實現(xiàn)文本和圖形的打印,獲得最好的打印質(zhì)量,還需 要對VB控制打印機的多種屬性有更深入的理解,例如打印機的坐標體系向屏幕 坐標體系的轉(zhuǎn)換、打印機字體尺寸的確定等。下面給出了打印程序的主框架:P rivate Sub mn uFile Prin t_Click()On Error Resume NextWin dows公用標準對話框mon Dialog控件:【打開】、【文件另存為】、 【打印】。mon Dialo
22、g控件在Visual Basic例程之間提供了接口。利用公用標準對話框應(yīng)用程序中要使用公用對話框,和Microsoft Windows【打印】 開發(fā)VB的打印程 必須首先在工具箱中添加monDialog Control6.0.Flags = 1Prin ter.F on tSize = dlgm on Dialog.F on tSizeIf ActiveForm Is Noth ing Withdlgmo nDialog.DialogTitle =.Ca ncelError = True打印Then Exit Sub打印機公用對話框?qū)⒋蛴C公用對話框設(shè)置的字體大小傳遞 給打印機.ShowPri
23、nter在屏幕上顯示【打印】公用對話框If Err MSDlg.cdlCa ncel The nPrin ter.F on tTra nsparent = False不透明Set Prin terScaleMyform的屬性PrintAny where Prin ter參數(shù)化例程初始化打印的字體為匹配打印機的縮放屬性與窗體可放置用戶編寫的打印對象實現(xiàn)字符和圖形的顯示Prin ter.New Page打印機坐標初始化PrintAny where Prin terPrin ter.New Page打印另一頁的內(nèi)容打印機坐標初始化Prin ter.E ndDoc將該任務(wù)加入打印機任務(wù)隊列End If
24、End WithEnd Sub參數(shù)化繪圖程序用VB開發(fā)應(yīng)用程序時,如果使用參數(shù)化繪圖例程進行屏幕顯示程序的開發(fā), 則在開發(fā)打印程序時,就不需再另行開發(fā)代碼,從而避免了大量的重復(fù)勞動,有 效地縮短了程序的開發(fā)周期。參數(shù)化繪圖例程就是:在開發(fā)例程時,為每一個例 行程序提供一個OBJECTS型的參數(shù),調(diào)用程序通過向例程的OBJECTS型參數(shù)分 別傳遞窗體、Prin ter對象,就可分別完成屏幕顯示與打印機輸出。見如下示例:Sub PrintAnywhere(Dest As Object)Dest .Print“HELLO”Dest Is Prin terThe nPrin ter.E ndDocEn
25、d IfEnd Sub要完成屏幕上的輸出,調(diào)用PrintAny where Myform即可,而調(diào)用PrintAny wherePrinter則完成在打印機上輸出。屬性匹配與窗體縮放因為控制打印機實際繪圖區(qū)域大小的屬性Height和Width,由目前正在使用Prin ter.KillDoc不打印空白頁取消當(dāng)前的打印任務(wù)的紙張決定,而且可打印的區(qū)域與紙張邊緣有一定距離。因而為了獲得正確的打印輸出結(jié)果,不能簡單地將Printer對象直接傳遞給繪圖例行程序,還必須要解 決打印機的縮放屬性與顯示窗體屬性相匹配的問題。即:保證使窗體中的打印內(nèi)容以正確的大小顯示,并居于可打印區(qū)域的中間。實際上實現(xiàn)的是打印
26、機的坐標 體系向屏幕坐標體系的轉(zhuǎn)換。具體過程是:使用打印機的ScaleX和ScaleY方法, 獲取以twip為單位的打印機尺寸,再利用窗體的ScaleX和ScaleY方法將這些尺寸轉(zhuǎn)換為窗體中的坐標系統(tǒng),從而實現(xiàn)以窗體的坐標系統(tǒng)提供打印機可打印區(qū) 域大小的目的。然后,用這些尺寸作為打印機中新的ScaleWidth和ScaleHeight, 即可實現(xiàn)屬性匹配。但是,我們在打印時,經(jīng)常會遇到這樣的場合一一在不改變窗體形狀的情況 下,需要擴大或縮小窗體的大小。要完成這樣的工作,不僅需要完成屬性匹配, 還要確定對象被縮放的系數(shù)。程序如下:P rivate Sub Set Prin terScale(o
27、bj As Object)Dim pwid As Si ngle, phgt As Sin gle, xmid As Sin gle, ymid As Sin gleDim owid As Sin gle, ohgt As Sin gleowid = obj.ScaleX(obj.ScaleWidth, obj.ScaleMode, vbTwi ps)ohgt = obj.ScaleY(obj.ScaleHeight, obj.ScaleMode, vbTwi ps)獲取窗體以Twips表示的尺寸pwid = Prin ter.ScaleX( Prin ter.ScaleWidth, Prin
28、 ter.ScaleMode, vbTwi ps)phgt = Prin ter.ScaleY( Prin ter.ScaleHeight, Prin ter.ScaleMode, vbTwi ps)獲取打印機以Twips表示的尺寸If (ohgt / owid p hgt / p wid) Thens = p hgt / ohgtElses = p wid / owidEnd If計算縮放因子pwid = obj.ScaleX( pwid, vbTw ips, obj.ScaleMode) / sp hgt = obj.ScaleY (p hgt, vbTw ips, obj.ScaleMo
29、de) / s將打印機的尺寸轉(zhuǎn)換成obj的坐標系統(tǒng)/縮放因子x_mid = obj.ScaleLeft + obj.ScaleWidth / 2y_mid = obj.ScaleT op + obj.ScaleHeight / 2標Prin ter.Scale (x_mid - pwid / 2, y_mid - p hgt / 2)-(x_mid + pwid / 2, y_mid + phgt / 2)設(shè)置打印機中新的ScaleWidth和ScaleHeight設(shè)置打印區(qū)域的中心點坐End Sub 坐標定位窗體、圖片框控件以及Printer對象提供的TextWidth和TextHeight
30、方法 在文本定位的應(yīng)用方面很有用。Textwidth、TextHeight分別以對象當(dāng)前的刻 度單位返回字符串的寬度和高度。但是必須注意很多字體中其字符寬度并不全部 相同, 所以不能簡單地將單個字符的寬度乘以字符數(shù)來獲得字符串的寬度。對那些沒有TextWidth和TextHeight的控件可通過設(shè)置父窗體的Font屬性,使其與 該控件的屬性相匹配,再利用父窗體的TextWidth和TextHeight獲得它的字符串的寬度和高度。但是,我們在完成屏幕顯示程序調(diào)試后,在進行打印輸出時卻出現(xiàn)了屏幕顯 示與打印結(jié)果的不一致性的現(xiàn)象,表現(xiàn)在所打印的字體之間坐標關(guān)系與屏幕顯示 不一樣,例如:屏幕顯示上的兩
31、個字符不重疊,而打印出的字符卻出現(xiàn)相互重疊 的現(xiàn)象。經(jīng)調(diào)試發(fā)現(xiàn),問題出現(xiàn)在字體尺寸的確定上。程序中,屏幕上顯示的字 符坐標是通過對象的TextWidth和TextHeight方法計算得來的,它直接受到字 體尺寸大小的影響。VB向用戶提供的字體是在用戶需要的打印機點的范圍內(nèi),如果你需要的字體大小為73點, 則打印出的實際字體大小為72.75。 然而窗體、 圖片框控件的Fontsize只能是整數(shù),例如它不能將字體的大小定為72.75,實際上這就造成了屏幕上顯示字體與實際打印字體大小之間產(chǎn)生了誤差。我們采用如下方法來解決該問題,就是在計算字體大小時,根據(jù)計算出來的字體尺寸,確定它存在的范圍,然后再將
32、它定位到VB提供的幾種固定大小的字體上,而不是隨意指定。當(dāng)然,也可以有其它的解決辦法。例如:字體大小選取偶數(shù)等。由 于篇幅所限,這里不再作介紹。以上是筆者在總結(jié)實際應(yīng)用工作中的一些心得與體會,希望本篇文章能對首 次使用VB開發(fā)打印程序的設(shè)計人員有所幫助。(6)VB 中不是有 Printers 集合嗎寫個 For Each 循環(huán)就能枚舉 Printers集合中的所有打印機Printer 對象和P rinters集合使用 Printer對象可以實現(xiàn)與系統(tǒng)打印機的通訊(最初是缺省系統(tǒng)打印機)用 P rinters集合可獲取有關(guān)系統(tǒng)上所有可用打印機的信息。語法Printer印窗體,則到頁底圖形圖象可能被剪切,而文本則被移到下一頁。集合可用來查詢可用的打印機,這樣就可以為應(yīng)用程序指定一臺缺省打印機。例如也許要下面的代碼查找所有的可用打印機,定位在第一個將頁碼設(shè)定為系統(tǒng)缺省打印機。屬性。如果想訪問個別打印機的可讀寫屬性,那么首先要使那個打印機成為應(yīng)用程序的缺省打印機。使用打印機集合打印機集合是一個包括操作系統(tǒng)中所有可用打印機的對象。打印機列表與打印安裝對話框Win
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版(2024)一年級數(shù)學(xué)上冊期末復(fù)習(xí)專項拔高卷(含答案)
- 河南省許昌市育才學(xué)校2025-2026學(xué)年七年級上學(xué)期期末歷史試卷(含答案)
- 化工企業(yè)消防培訓(xùn)
- 2026年石化行業(yè)策略報告:上游油價觸底、下游供給側(cè)優(yōu)化加速產(chǎn)業(yè)鏈有望迎來共振周期
- 鋼網(wǎng)架結(jié)構(gòu)安裝技術(shù)要點
- 鋼結(jié)構(gòu)工程技術(shù)(35個)
- 2026山東聊城市市屬事業(yè)單位招聘初級綜合類崗位人員87人考試備考試題及答案解析
- 2026廣東廣州市中山大學(xué)腫瘤防治中心中心鼻咽科陳秋燕教授課題組自聘技術(shù)員招聘2人備考考試題庫及答案解析
- 三明林校2025-2026學(xué)年第二學(xué)期外聘教師招聘備考考試題庫及答案解析
- 2026新疆烏市第126中學(xué)慈湖初中部急聘初中物理老師備考考試試題及答案解析
- 2026年張家界航空工業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試必刷測試卷附答案
- 新版二年級道德與法治《我們都是中國人》教學(xué)設(shè)計(2課時)
- XX企業(yè)核心優(yōu)勢與戰(zhàn)略發(fā)展
- 2025年中國低氘水行業(yè)市場全景分析及前景機遇研判報告
- 管道區(qū)段長管理辦法
- 2025年江西公務(wù)員考試(財經(jīng)管理)測試題及答案
- CRT-YS4690消防控制室圖形顯示裝置使用說明書-營口賽福德
- 植筋工程施工驗收記錄表范例
- 2025至2030年中國冷凍食品行業(yè)市場調(diào)研及行業(yè)投資策略研究報告
- 壓空罐安全知識培訓(xùn)課件
- 2025年江蘇南京市建鄴區(qū)招聘第一批購崗人員5人筆試模擬試題及答案詳解1套
評論
0/150
提交評論