1、VB中打印机选择(1)假设你的COMMONDIALOG 控件叫CMDiag用如下代码可以使你选择的打印机成为默认打印机 PrinterOn Error Resume NextCMDiag.PrinterDefault = TrueCMDiag.CancelError = TrueCMDiag.ShowPrinterIf Err.Number 0 Then Exit Sub(2)VB 里面, 原本改变预设打印机的方法是: (假设安装有两种打印机(驱动程式)Set Printer = Printers(O)将预设打印机设定成第一种打印机Set Printer = Printers(1)将预设打印机
2、设定成第二种打印机但实际上以上叙述有时候不会成功(原因不详), 为了能够成功地改变预设打印机,以下是呼叫Windows API 的方法:(此一解决方案适用於 Windows 95,98)1.API 的宣告:Const HWND_BROADCAST = & HFFFF &Const WM_WININICHANGE = & H1APrivate Declare Function GetPro Lib kernel32 Alias _GetPro (ByVai lpAppName As String, ByVai lpKeyName As _String, ByVal lpDefault As St
3、ring, ByVal lpReturnedString As String, _ ByVal nSize As Long) As LongPrivate Declare Function WritePro Lib kernel32 Alias _WritePro (ByVal lpszSection As String, ByVal lpszKeyName _As String, ByVal lpszString As String) As LongLong,Private Declare Function SendMessage Lib user32 Alias SendMessageA
4、(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As lParam As Any) As Long2.程式范例:PrinterName =您想设定的打印机名称Dim S As String, length As Long, hKey As LongS = String(80, Chr(O)length = GetPro(devices, PrinterName, , S, Len(S)S = Left(S, length)& S)Call WritePro(windows, device, PrinterName &至於改变 NT 预
5、设打印机的方法, 则是改变登录资料库(Registry)打印机的设定,在登录资料库中纪录预设打印机的 Value 是:HKEY_CURRENT_USERSoftwareMicrosoftWindowsNTCurrentVersionWindows subkey 的 Device value(3)VB中获取指定打印机的各种纸张类型及大小放入一个 MSFIexGrid,名称为fgdl,列数为4Optio nExplicitPrivateCo nstDC_MAXEXTENT=5PrivateCo nstDC_MINEXTENT=4PrivateCo nstDC_PAPERNAMES16Private
6、Co nstDC_PAPERS= 2PrivateCo nstDC_PAPERSIZE =3PrivateDeclareFunction DeviceCapabilitiesLibwin spool.drvAliasDeviceCapabilitiesA(ByVal lpDeviceName AsStri ng,ByVallpPortAsStri ng, ByValiln dexAs Long, lpOutput AsAny, lpDevModeAs Any)AsLongPrivate Type POINTSx As Longy As LongEnd TypePrivate Sub Form_
7、Load()Dim i As LongWith fgdl.Clear.FormatString = A纸张编号|A纸张名称|A纸张长度|A纸张宽度”For i = 0 To .Cols - 1.ColWidth(i) = 1700Next i.AllowUserResizi ng = flexResizeColu mns.Left = 0.Width = Me.ScaleWidthEnd WithGetPaperI nfoEnd SubPrivate Sub GetPaperI nfo()Dim i As Long, ret As LongDim Len gth As In teger, Wi
8、dth As In tegerDim PaperNo() As In teger, PaperName() As Stri ng, PaperSize() As POINTS 支持最大打印纸:ret = DeviceCapabilities(打印机名称,LPT1, DC_MAXEXTENT, ByVal0&,ByVal0&)Len gth = ret 65536Width = ret - Len gth* 65536lblMaxLe ngth.Capti on =Len gthIbIMaxWidth.C apti on =Width支持最小打印纸:ret = DeviceCapabilitie
9、s(打印机名称,LPT1, DC_MINEXTENT, ByVal0&,ByVal0&)Len gth = ret 65536Width = ret - Len gth* 65536支持纸张种类数ret = DeviceCapabilities(打印机名称,LPT1, DC_PAPERS, ByVal0&, ByVal0&)纸张编号ReDim PaperNo(1 To ret) As 1In tegerCall DeviceCapabilities(打印机名称,LPT1, DC_PAPERS, PaperNo(1), ByVal0&)纸张名称Dim arrPageName() As ByteD
10、im allNames As Stri ngDim lStart As Lo ng, lEnd AsLo ngReDim PaperName(1 To ret) AsStri ngReDim arrPageName(1 To ret *64) As ByteCall DeviceCapabilities(打印机名称,LPT1, DC_PAPERNAMESarrPageName(1),ByVal 0&)allNames = StrC on v(arrPageName,vbUni code)loop through the stri ng andsearch forthenames ofthe p
11、apersi = 1DoIE nd = In Str(IStart + 1, allNames, Chr$(O), vbBi naryCompare)If (lE nd 0) And (lEnd - lStart - 1 0) The nPaperName(i) = Mid$(allNames, lStart + 1, lE nd - lStart-1)i = i + 1End IflStart = lEndLoop Un til lE nd = 0纸张尺寸ReDim PaperSize(1 To ret) As POINTSCall DeviceC apabilities(Form2.Com
12、bo1.Text, LPT1, DC_PAPERSIZE, PaperSize(1), ByVal 0&)显示在表格中For i = 1 To retfgdl.Addltem Pap erNo(i) & vbTab & PaperName(i) & vbTab & PaperSize(i).y & vbTab & PaperSize(i).xNext i移除第一个空行fgd1.Row = 1fgd1.RemoveItem 1End SubPrivate Sub Form_Resize()With fgd1.Left = 0.Width = Me.ScaleWidth .Height = Me.
13、ScaleHeight.Top = 0End WithEnd Sub(5)编写VB打印控制程序的几点心得摘 要 本文在总结作者实际开发经验的基础上, 详细介绍了 VB实现高分辨率打印 方法的几点心得。阐述了参数化绘图程序缩短打印程序开发时间的方法以及打印机缩 放属性与窗体属性匹配使用的技巧, 并总结了解决坐标定位、图形与其实际打印位置出现误差等问题的经验。关键词 PrintForm 高分辨率打印参数化绘图缩放属性Some Experie nces on VB Print Con trolBai Yang, Wang PengComputer Science Departme ntUn iver
14、sity of In formatio n and Engin eeri ngZhen gzhou, ChinaAbstract : On the basis of our working experiences, we have given a detaildescription about VB print method of high resolution. Wefocus on how to shortendevelop ing period with parameterized plot program, the match betwee n the zoomattribute an
15、d the attribute of display win dow etc., which based on print programof Printer Object. In addition to this, we have introduced some experiences on deali ng with positi on error that caused by the mismatch betwee n font and graph on screen and that on printer.Keywords: PrintForm, High Resolution Pri
16、nt, parameterized plot ,zoomattribute1.简介Visual Basic (VB)给用户提供了可视化编程环境,因其简单易学、功能强大而得到了广泛的应用。VB提供了两种实现打印的方法。一般在对打印质量要求不高的场合,或者 是编程项目的早期开发过程中,可以直接使用 VB窗体的Printform 方法实现打印。用这种方法实现打印具有编程简单、易用并且功能强大的优点,它只需要通过一行代码,几乎能打 印所有内容。实现的方法就是:首先将要打印的内容在屏幕上显示出来 ,然后开发人员只要为窗体对象激活 PrintForm ,窗体则自动将 要打印的内容 发送到Printer对象
17、上,其语法格式如下:窗体.PrintForm 。如果窗体中包括图形,那么打印前应先置窗体的AutoRedraw属性为真。这种方法虽然简单,但是它却存在着内存消耗大、打印粗糙、 速度慢等缺陷,尤其对于带有滚动条的图像, 这种方法只能打印当前可视的区域。 在实际应用中经常会遇到对打印质量要求很高的场合, 例如打印 音乐五线谱,对打印的美观、清晰度以及音符符头的位置都有很严格的要求, 这种应用场合若采用 VB提供的另一种基于 Prin ter对象的打印方法则可以获得高分辨率的打印, 得到很高的打印质量。 在实际应用中,也可以根据实际应用情况将上述两种方法结合起来使用,即:前期工作使用 Prin tF
18、orm 简单的打印方法将窗体的布局定下来,后期再使用基于 Printer对象的打印方法实现最终的打印工作。2.高分辨率打印程序开发心得Prin ter 对象VB的打印可以使用 Prin ter对象。Prin ter对象是一个独立于打印机设备的封装,它 可以代表不同的打印机,初始时,Printer对象为系统缺省的打印机,也可以使用下列语句: Set Printer=Printers(2)( 其中2代表Printers 集中的第二个打印机 )对打印机进行指Printer 对象具备例如: ColorMode、Copies、Duplex、Printquality 等控制打印机特征的属性,提供了 New
19、page EndDoc KillDoc等控制打印过程的方法,以及大多数由窗 体和图片框控件提供的图形属性和方法如: Currentx、Currenty、Textwidth、Textheight、Print、Pset、Line、PaintPicture 和Circle 等方法,它还拥有 Font的所有属性。实现高 分辨率的打印就是通过控制 Prin ter对象的上述属性和方法完成的。直接利用 Windows公用标准对话框CommonDialogK件【打印】VB为用户提供了 Win dows公用标准对话框 Commo nDialog控件:【打开】、【文件另存 为】、【颜色】、【字体】、【打印】。
20、Com mon Dialog控件在Visual Basic和Microsoft Windows动态连接库Commdlg.dll例程之间提供了接口。利用公用标准对话框【打印】开发 VB的打印程序,将大大缩短程序的开发周期。应用程序中要使用公用对话框,必须首先在 工具箱中添加公用对话框控件。该动作通过激活【部件】对话框,选中 Microsoft Com monDialog Control6.0, 单击【确定】即可。然后再将公用控件添加到窗体上并设置相应属性, 该控件具有的属性有 Color、Font、Print、Help等。VB提供mnu ()过程供用户添加开发的打印程序代码。Printer对象控
21、制打印的基本过程利用Printer对象开发的打印程序主要靠其提供的 NewPage (打印新的一页,CurrentX、CurrentY置为新页的左上角,可完成多页功能。)、EndDoc (将 打印任务加入打印机队列)、KillDoc (取消打印任务)控制打印过程的。一般情况下,打印程序完成多页打印时会多次执行 NewPage,结束时执行一次EndDoc将打印任务加入打印机队列。 如果你在NewPage后,立即使用EndDoc,VB则不会打印额外的空白页。如果希望显示空白页,则可在新的一页上只使用Prin ter.Pri nt 打印空字符即可。为了通过Printer对象实现文本和图形的打印,获得
22、最好的打印质量,还需要 对VB控制打印机的多种属性有更深入的理解, 例如打印机的坐标体系向屏幕坐标体系的转换、打印机字体尺寸的确定等。下面给出了打印程序的主框架:Private Sub mn uClick()On Error Resume NextIf ActiveForm Is Nothi ng The n Exit SubWith dlgCommo nDialog 打印机公用对话框.DialogTitle = 打印.Ca ncelError = True.Flags = 1Prin ter.F on tSize = dlgCom mon Dialog.F on tSize将打印机公用对话框
23、设置的字体大小传递给打印机.ShowPrinter 在屏幕上显示【打印】公用对话框If Err MSComDlg.cdlCa ncel The nPrin ter.Fo ntTra nspare nt = False 初始化打印的字体为不透明SetPri nterScale Myform的属性PrintAny where Prin ter参数化例程匹配打印机的缩放属性与窗体可放置用户编写的打印对象实现字符和图形的显示Prin ter.NewPage打印机坐标初始化PrintAny where Prin ter打印另一页的内容Prin ter.NewPage打印机坐标初始化Prin ter.E
24、ndDoc将该任务加入打印机任务队列不打印空白页Prin ter.KillDoc取消当前的打印任务End IfEnd WithEnd Sub参数化绘图程序用VB开发应用程序时,如果使用参数化绘图例程进行屏幕显示程序的开发, 则在开发打印程序时,就不需再另行开发代码,从而避免了大量的重复劳动,有 效地缩短了程序的开发周期。参数化绘图例程就是:在开发例程时,为每一个例 行程序提供一个OBJECTS型的参数,调用程序通过向例程的 OBJECTS型参数分 别传递窗体、Prin ter对象,就可分别完成屏幕显示与打印机输出。 见如下示例:Sub PrintAnywhere (Dest As Object
25、 )Dest.Pri nt “ HELLO”Dest Is Prin ter The nPrin ter.E ndDocEnd IfEnd Sub要完成屏幕上的输出,调用PrintAny where Myform即可,而调用PrintAny where Printer则完成在打印机上输出。属性匹配与窗体缩放因为控制打印机实际绘图区域大小的属性 Height和Width,由目前正在使用的纸张决定,而且可打印的区域与纸张边缘有一定距离。 因而为了获得正确的打印输出结果,不能简单地将Printer对象直接传递给绘图例行程序,还必须要解 决打印机的缩放属性与显示窗体属性相匹配的 问题。即:保证使窗体中
26、的打印 内容以正确的大小显示,并居于可打印区域的中间。实际上实现的是打印机的坐标 体系向屏幕坐标体系的转换。具体过程是:使用打印机的ScaleX和ScaleY方法, 获取以twip为单位的打印机尺寸,再利用窗体的 ScaleX和ScaleY方法将这些 尺寸转换为窗体中的坐标系统,从而实现以窗体的坐标系统提供打印机可打印区 域大小的目的。然后,用这些尺寸作为打印机中新的 ScaleWidth和ScaleHeight , 即可实现属性匹配。但是,我们在打印时,经常会遇到这样的场合一一在不改变窗体形状的情况 下,需要扩大或缩小窗体的大小。要完成这样的工作,不仅需要完成属性匹配, 还要确定对象被缩放的
27、系数。程序如下:Private Sub SetPri nterScale(obj As Object)Dim pwid As Single, phgt As Single, xmid As Single, ymid As SingleDim owid As Sin gle, ohgt As Sin gleowid = obj.ScaleX(obj.ScaleWidth, obj.ScaleMode, vbTwips)ohgt = obj.ScaleY(obj.ScaleHeight, obj.ScaleMode, vbTwips)获取窗体以Twips表示的尺寸pwid = Printer.Sc
28、aleX(Printer.ScaleWidth, Printer.ScaleMode, vbTwips)phgt = Prin ter.ScaleY(Pri nter.ScaleHeight, Prin ter.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, vbTw
29、ips, obj.ScaleMode) / s将打印机的尺寸转换成obj的坐标系统/缩放因子x_mid = obj.ScaleLeft + obj.ScaleWidth / 2y_mid = obj.ScaleTop + obj.ScaleHeight / 2 设置打印区域的中心点坐标Prin ter.Scale (x_mid - pwid / 2, y_mid - phgt / 2)-(x_mid + pwid / 2, y_mid + phgt / 2)设置打印机中新的ScaleWidth和ScaleHeightEnd Sub坐标定位窗体、图片框控件以及Printer对象提供的TextWidth和TextHeight方法在 文本定位的应用方面很有用。TextWidth、TextHeight分别以对象当前的刻度 单位返回字符串的宽度和高度。但是必须注意很多字体中其字符宽度并不全部相 同,所以不能简单地将单个字符的宽度乘以字符数来获得字符串的宽度。 对那些没有TextWidth和TextHeight的控件可通过设置父窗体的 Font属性,使其与该 控件的属性相匹配,再利用父窗体的 TextWidth和TextHei
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1