




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、VB 中打印機選擇(1)假設(shè)您的 COMMONDIALOG 控件叫 CMDiag用如下代碼可以使您選擇的打印機成為默認打印機PrinterOn Error Resume NextCMDiag 、 PrinterDefault = TrueCMDiag 、 CancelError = TrueCMDiag 、 ShowPrinterIf Err 、 Number 0 Then Exit Sub(2)VB 里面 , 原本改變預(yù)設(shè)打印機的方法就是:(假設(shè)安裝有兩種打印機(驅(qū)動程式)SetPrinter=Printers(0)將預(yù)設(shè)打印機設(shè)定成第一種打印機SetPrinter=Printers(1)將
2、預(yù)設(shè)打印機設(shè)定成第二種打印機但實際上以上敘述有時候不會成功(原因不詳), 為了能夠成功地改變預(yù)設(shè)打印機,以下就是呼叫 Windows API 的方法 :( 此一解決方案適用於 Windows 95,98)1 、 API 的宣告 :Const HWND_BROADCAST = &HFFFF&Const WM_WININICHANGE = &H1APrivate Declare Function GetPro Lib kernel32 Alias _ GetPro(ByVallpAppName As String,ByVal lpKeyName As _String, ByVal lpDefaul
3、t As String, ByVal lpReturnedString As String, _ ByVal nSize AsLong) AsLongPrivateDeclareFunction WritePro Libkernel32 Alias_WritePro (ByVallpszSectionAsString, ByVal lpszKeyName _As String, ByVal lpszString As String) As LongLong,Private Declare Function SendMessage Lib user32 Alias SendMessageA (B
4、yVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As lParam As Any) As Long2 、 程式范例 :PrinterName =您想設(shè)定的打印機名稱 Dim S As String, length As Long, hKey As LongS = String(80, Chr(0)length= GetPro(devices,PrinterName, , S, Len(S)S =Left(S, length)Call WritePro(windows, device, PrinterName &,& S)&H7FFF&,
5、ByVal windows)Call SendMessage(HWND_BROADCAST, WM_WININICHANGE,至於改變NT預(yù)設(shè)打印機的方法,則就是改變登錄資料庫(Registry)打印機的設(shè)定在登錄資料庫中紀(jì)錄預(yù)設(shè)打印機的 Value 就是 :HKEY_CURRENT_USERSoftwareMicrosoftWindowsNTCurrentVersionWindows subkey 的 Device value(3)VB 中獲取指定打印機的各種紙張類型及大小放入一個 MSFlexGrid, 名稱為 fgd1, 列數(shù)為 4OptionExplicitPrivateConstDC
6、_MAXEXTENT=5PrivateConstDC_MINEXTENT=4Private Const DC_PAPERNAMES= 16PrivateConstDC_PAPERS= 2PrivateConstDC_PAPERSIZE =3Private DeclareFunction DeviceCapabilities Lib winspool、drv Alias DeviceCapabilitiesA (ByVal lpDeviceName As String, ByVal l pPort As String, ByValiIndex As Long,lpOutput As Any, l
7、pDevMode AsAny) As LongPrivate Type POINTSxAs LongyAs LongEnd TypePrivate Sub Form_Load()Dim i As LongWith fgd1、 Clear、Formatstring = A紙張編號|A紙張名稱|A紙張長度|A紙張寬度For i = 0 To 、 Cols -1、 ColWidth(i) = 1700 Next i、 AllowUserResizing = flexResizeColumns 、 Left = 0、 Width = Me、 ScaleWidthEnd WithGetPaperInfo
8、End SubPrivate Sub GetPaperInfo()Dim i As Long, retAs LongDim Length As Integer, Width As IntegerDim PaperNo() As Integer, PaperName() As String, PaperSize() As POINTS 支持最大打印紙:ret = DeviceCapabilities(打印機名稱,LPT1, DC_MAXEXTENT,ByVal 0&, ByVal 0&)Length = ret 65536Width = ret - Length * 65536lblMaxLen
9、gth 、 Caption = LengthlblMaxWidth 、 Caption = Width機名 支持最小打印紙:ret = DeviceCapabilities(打印稱,LPT1, DC_MINEXTENT, ByVal 0&, ByVal 0&)Length = ret 65536Width = ret - Length * 65536 支持紙張種類數(shù)ret = DeviceCapabilities(打印機稱,LPT1, DC_PAPERS, ByVal 0&, ByVal 0&) 紙張編號ReDim PaperNo(1 To ret) As IntegerCall Device
10、Capabilities(打印機稱,LPT1, DC_PAPERS, PaperNo(1), ByVal 0&) 紙張名稱Dim arrPageName() As ByteDim allNames As StringDim lStart As Long, lEnd As LongReDim PaperName(1 To ret) As StringReDim arrPageName(1 To ret * 64) As ByteCall DeviceCapabilities(打印機稱, LPT1,DC_PAPERNAMES,arrPageName(1),ByVal 0&)allNames = S
11、trConv(arrPageName, vbUnicode)loop through the string and search for the names of the papersDoChr$(0), vbBinaryCompare)-1 0) ThenlStart + 1, lEnd - lStartCombo1lEnd = InStr(lStart + 1, allNames, If (lEnd 0) And (lEnd - lStartPaperName(i) = Mid$(allNames,-1)i = i + 1End IflStart = lEndLoop Until lEnd
12、 = 0 紙張尺寸ReDim PaperSize(1 To ret) As POINTSCall DeviceCapabilities(Form2、Text, LPT1, DC_PAPERSIZE, PaperSize(1), ByVal 0&) 顯示在表格中For i = 1 To retfgd1 VB中打印機選擇AddItem PaperNo(i) & vbTab & PaperName(i) & vbTab & PaperSize(i) 、 y & vbTab & PaperSize(i) 、xNext i移除第一個空行fgdl、Row = 1fgdl、RemoveItem 1End S
13、ubPrivate Sub Form_Resize()With fgd1、Left = 0、Width = Me ScaleWidth、Height = Ma ScaleHeight、Top = 0End WithEnd Sub(5)編寫VB打印控制程序的幾點心得摘 要 本文在總結(jié)作者實際開發(fā)經(jīng)驗的基礎(chǔ)上,詳細介紹了 VB實現(xiàn)高分辨率打印 方法 的幾點心得。闡述了參數(shù)化繪圖程序縮短打印程序開發(fā)時間的方法以及打印機縮 放屬性與窗體屬性匹配使用的技巧,并總結(jié)了解決坐標(biāo)定位、圖形與其實際打印 位置出現(xiàn)誤差等問題的經(jīng)驗。關(guān)鍵詞 PrintForm高分辨率打印參數(shù)化繪圖縮放屬性Some Experien
14、ces on VB Print ControlBai Yang, Wang PengComputer Science DepartmentUniversity of Information and EngineeringZhengzhou, ChinaAbstract: On the basis of our working experiences, wehave given a detaildescription about VB print method of high resolution 、We focus on how to shorten developing period wit
15、h parameterized plot program, the match between the zoom attribute and the attribute of display window etc、 , which based on print programof Printer Object 、 In addition to this, we have introduced some experiences on dealing with position error that caused by the mismatch between font and graph on
16、screen and that on printer 、Keywords: PrintForm, High Resolution Print, parameterized plot ,zoom attribute1 .簡介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)的方法就就是:首先
17、將要打印的內(nèi)容在屏幕上顯示出來,然后開發(fā)人員只要為窗體對象激活 PrintForm ,窗體則自動將要打印的內(nèi)容發(fā)送到Printer對象上,其 語法格式如下:窗體、PrintForm 。如果窗體中包括圖形,那么打印前應(yīng)先置窗體的 AutoRedraw屬性為真。這種方法雖然簡單,但就是它卻存在著內(nèi)存消耗大、打印粗糙、速度慢等缺陷,尤其對于帶有滾動條的圖像,這種方法只能打印當(dāng)前可視的區(qū)域。在實際應(yīng)用中經(jīng)常會遇到對打印質(zhì)量要求很高的場合,例如打印音樂五線譜,對打印的美觀、清晰度以及音符符頭的位置都有很嚴(yán)格的要求,這種應(yīng)用場合若采用 VB提供的另一種基于Printer對象的打 印方法則可以獲得高分辨率的
18、打印,得到很高的打印質(zhì)量。在實際應(yīng)用中,也可以根據(jù)實際應(yīng)用情況將上述兩種方法結(jié)合起來使用,即:前期工作使用PrintForm 簡單的打印方法將窗體的布局定下來,后期再使用基于Printer對象的打印方法實現(xiàn)最終的打印工作。2 .高分辨率打印程序開發(fā)心得Printer 對象VB的打印可以使用 Printer對象。Printer對象就是一個獨立于才T印機設(shè)備的封裝,它可以代表不同的打印機,初始時,Printer 對象為系統(tǒng)缺省的打印機,也可以使用下列語 句:Set Printer=Printers(2)( 其中2代表Printers 集中的第二個打印機)對打印機進行 指定。Printer 對象具備
19、例如:ColorMode、Copies、Duplex、Printquality等控制打印機特征的屬性,提供了 Newpage EndDoc、KillDoc等控制打印過程的方法,以及大多數(shù)由窗體與 圖片框控件提供的圖形屬性與方法如:Currentx、Currenty、Textwidth、Textheight、Print、Pset、Line、PaintPicture 與Circle 等方法,它還擁有Font的所有屬性。實現(xiàn)高分辨率的 打印就就是通過控制Printer對象的上述屬性與方法完成的。直接利用 Windows公用標(biāo)準(zhǔn)對話框CommonDialogf空件【打印】VB為用戶提供了 Window
20、s公用標(biāo)準(zhǔn)對話框 CommonDialog控件:【打開】、【文件另存 為】、【顏色】、【字體】、【打印】。 CommonDialog控件在Visual Basic與Microsoft Windows動態(tài)連接庫Commdlg dll例程之間提供了接口。利用公用標(biāo)準(zhǔn)對話框【打印】開 發(fā)VB的打印程序,將大大縮短程序的開發(fā)周期。應(yīng)用程序中要使用公用對話框,必須首先在工具箱中添加公用對話框控件。該動作通過激活【部件】對話框 ,選中Microsoft Common Dialog Control6、0,單擊【確定】即可。然后再將公用控件添加到窗體上并設(shè)置相應(yīng)屬性,該控件具有的屬性有Color、Font、P
21、rint、Help等。VB提供mnu()過程供用戶添加開發(fā)的打印程序代碼。Printer對象控制打印的基本過程利用Printer 對象開發(fā)的打印程序主要靠其提供的NewPage仃印新的一頁,CurrentX、CurrentY置為新頁的左上角,可完成多頁功能。/EndDoc (將打 印任務(wù)加入打印機隊列卜KillDoc(取消打印任務(wù))控制打印過程的。一般情況下,打印程序完成多頁打印時會多次執(zhí)行NewPage結(jié)束時執(zhí)行一次EndDoc將打印任務(wù)加入打印機隊列。如果您在NewPage后,立即使用EndDoc,VB則不會打印額外的空白頁。如果希望顯示空白頁,則可在新的一頁上只使用Printer、Pri
22、nt “打印空字符即可。為了通過Printer對象實現(xiàn)文本與圖形的打印,獲得最好的打印質(zhì)量,還需要對 VB控制打印機的多種屬性有更深入的理解,例如打印機的坐標(biāo)體系向屏幕坐標(biāo) 體系的轉(zhuǎn)換、打印機字體尺寸的確定等。下面給出了打印程序的主框架:Private Sub mnu()On Error Resume NextIf ActiveForm Is NothingThen Exit SubWith dlgCommonDialog打印機公用對話框、DialogTitle = 打印、CancelError = True、Flags = 1Printer 、FontSize = dlgCommonDial
23、og 、FontSize將打印機公用對話框設(shè)置的字體大小傳遞給打印機、ShowPrinter在屏幕上顯示【打印】公用對話框If Err MSComDlg 、cdlCancel ThenPrinter 、FontTransparent = False初始化打印的字體為不透明SetPrinterScaleMyform匹配打印機的縮放屬性與窗體的屬性PrintAnywhere Printer可放置用戶編寫的打印對象參數(shù)化例程實現(xiàn)字符與圖形的顯示Printer、NewPage打印機坐標(biāo)初始化PrintAnywhere Printer打印另一頁的內(nèi)容Printer、NewPage打印機坐標(biāo)初始化Prin
24、ter 、EndDoc將該任務(wù)加入打印機任務(wù)隊列不打印空白頁Printer 、KillDoc取消當(dāng)前的打印任務(wù)End IfEnd WithEnd Sub參數(shù)化繪圖程序用VB開發(fā)應(yīng)用程序時,如果使用參數(shù)化繪圖例程進行屏幕顯示程序的開發(fā), 則在開發(fā)打印程序時,就不需再另行開發(fā)代碼,從而避免了大量的重復(fù)勞動,有效 地縮短了程序的開發(fā)周期。參數(shù)化繪圖例程就就是:在開發(fā)例程時,為每一個例行程序提供一個OBJEC底型的參數(shù),調(diào)用程序通過向例程的OBJEC底型參數(shù)分別 傳遞窗體、Printer對象,就可分別完成屏幕顯示與打印機輸出。見如下示例:Sub PrintAnywhere(Dest As Object
25、)Dest、Print “HELLO!Dest Is Printer ThenPrinter、EndDocEnd IfEnd Sub要完成屏幕上的輸出,調(diào)用PrintAnywhere Myform 即可,而調(diào)用PrintAnywhere Printer則完成在打印機上輸出。屬性匹配與窗體縮放因為控制打印機實際繪圖區(qū)域大小的屬性Height與Width,由目前正在使用的紙張決定,而且可打印的區(qū)域與紙張邊緣有一定距離。因而為了獲得正確的打 印輸出結(jié)果,不能簡單地將Printer對象直接傳遞給繪圖例行程序,還必須要解決 打印機的縮放屬性與顯示窗體屬性相匹配的問題。即:保證使窗體中的打印內(nèi)容以正確的大
26、小顯示,并居于可打印區(qū)域的中間。實際上實現(xiàn)的就是打印機的坐標(biāo)體 系向屏幕坐標(biāo)體系的轉(zhuǎn)換。具體過程就是:使用打印機的ScaleX與ScaleY方法, 獲取以twip為單位的打印機尺寸,再利用窗體的ScaleX與ScaleY方法將這些尺 寸轉(zhuǎn)換為窗體中的坐標(biāo)系統(tǒng),從而實現(xiàn)以窗體的坐標(biāo)系統(tǒng)提供打印機可打印區(qū)域 大小的目的。然后,用這些尺寸作為打印機中新的 ScaleWidth與ScaleHeight, 即可實現(xiàn)屬性匹配。但就是,我們在打印時,經(jīng)常會遇到這樣的場合一一在不改變窗體形狀的情 況下,需要擴大或縮小窗體的大小。要完成這樣的工作,不僅需要完成屬性匹配, 還要確定對象被縮放的系數(shù)。程序如下:Pr
27、ivate 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)獲取窗體以Twips表示的尺寸pwid = Printer 、ScaleX(Pri
28、nter 、ScaleWidth, Printer 、ScaleMode, vbTwips)phgt = Printer 、ScaleY(Printer 、ScaleHeight, Printer 、ScaleMode, vbTwips)獲取打印機以Twips表示的尺寸If (ohgt / owid phgt / pwid) Thens = phgt / ohgtElses = pwid / owidEnd If計算縮放因子pwid = obj 、ScaleX(pwid, vbTwips, obj、ScaleMode) / sphgt = obj 、ScaleY(phgt, vbTwips,
29、obj、ScaleMode) / s將打印機的尺寸轉(zhuǎn)換成obj的坐標(biāo)系統(tǒng)/縮放因子x_mid = obj 、ScaleLeft + obj 、ScaleWidth / 2y_mid = obj、ScaleTop + obj、ScaleHeight / 2設(shè)置打印區(qū)域的中心點坐標(biāo)Printer、Scale (x_mid - pwid / 2, y_mid - phgt / 2)-(x_mid + pwid / 2, y_mid + phgt / 2)設(shè)置打印機中新的ScaleWidth與ScaleHeightEnd Sub(6)坐標(biāo)定位窗體、圖片框控件以及Printer對象提供的TextWidt
30、h與TextHeight方法在 文本定位的應(yīng)用方面很有用。TextWidth、TextHeight分別以對象當(dāng)前的刻度 單位返回字符串的寬度與高度。但就是必須注意很多字體中其字符寬度并不全部 相同,所以不能簡單地將單個字符的寬度乘以字符數(shù)來獲得字符串的寬度。對那 些沒有TextWidth與TextHeight的控件可通過設(shè)置父窗體的 Font屬性,使其與 該控件的屬性相匹配,再利用父窗體的TextWidth與TextHeight獲得它的字符串 的寬度與高度。但就是,我們在完成屏幕顯示程序調(diào)試后,在進行打印輸出時卻出現(xiàn)了屏幕 顯示與打印結(jié)果的不一致性的現(xiàn)象,表現(xiàn)在所打印的字體之間坐標(biāo)關(guān)系與屏幕顯
31、 示不一樣,例如:屏幕顯示上的兩個字符不重疊,而打印出的字符卻出現(xiàn)相互重疊 的現(xiàn)象。經(jīng)調(diào)試發(fā)現(xiàn),問題出現(xiàn)在字體尺寸的確定上。程序中,屏幕上顯示的字符坐標(biāo)就是通過對象的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 對象與 Printers 集合使用 Printer對象可以實現(xiàn)與系統(tǒng)打印機的通訊(最初就是缺省系統(tǒng)打印機)用 Printers集合可獲取有關(guān)系統(tǒng)上所有可用打印機的信息。語法PrinterPrinters(index)index所在處表示從0至UPrinters、Count-1 之間的整數(shù)說明用圖形方法在Printer對象上繪制文本與圖形。一旦 Printer 對象中含有將要打印的輸出信息,可用 EndDoc 方法直接將輸出信息送到應(yīng)用程序的缺省打印機上。如果要打印這些信息,應(yīng)該檢查與可能還要修正窗體的布局。例如,如果用PrintForm 方法打印窗體,則到頁底圖形圖象可能被剪切,而文本則被移到下一頁。Printers集合可用來查詢可
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電信客服人員心理素質(zhì)與情緒管理
- 科技類展會中的目標(biāo)客戶挖掘與定位
- 科技企業(yè)知識產(chǎn)權(quán)的申請與維護流程
- 全國粵教版信息技術(shù)七年級上冊第一單元第三節(jié)2.《利用搜索引擎搜索信息》教學(xué)設(shè)計
- 知識產(chǎn)權(quán)教育在商業(yè)競爭中的戰(zhàn)略價值
- 現(xiàn)代餐飲營銷網(wǎng)絡(luò)短視頻的巨大潛力
- 增加股東合同范本
- 委托租賃會展合同范本
- 2024年云南省中國人民財產(chǎn)保險股份有限公司招聘考試真題
- 2024年新疆事業(yè)單位招聘考試真題
- 【歷史】“開元盛世”課件-+2024-2025學(xué)年統(tǒng)編版歷史七年級下冊
- 2025年春新人教版化學(xué)九年級下冊課件 第九單元 溶液 1-課題1 溶液及其應(yīng)用 第1課時 溶液的形成
- 2024-2025學(xué)年高中物理第十二章機械波4波的衍射和干涉課時作業(yè)含解析新人教版選修3-4
- 2025年新華師大版數(shù)學(xué)七年級下冊全冊導(dǎo)學(xué)案
- 2025年內(nèi)蒙古化工職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 《供熱工程》課件
- 倉管員業(yè)務(wù)技能培訓(xùn)
- 安全管理人員七大職責(zé)
- 《國民經(jīng)濟行業(yè)分類與代碼》
- 音樂教育國際化進程-洞察分析
- 2025年中鐵特貨物流股份限公司招聘畢業(yè)生52人高頻重點提升(共500題)附帶答案詳解
評論
0/150
提交評論