




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、假设你的 COMMONDIALOG 控件叫 CMDiag 用如下代码可以使你选择的打印机成为默认打印机 "Printer" On Error Resume NextCMDiag.PrinterDefault = True CMDiag.CancelError = True CMDiag.ShowPrinterIf Err.Number <> 0 Then Exit Sub (2)VB ? 里面, ? 原本改变预设打印机的方法是: (假设安装有两种打印机 (驱动程式 ) ? Set ? Printer ? = ? Printers(0) ? ' ? 将预设
2、打印机设定成第一种打印机? Set ? Printer ? = ? Printers(1) ? ' ? 将预设打印机设定成第二种打印机? 但实际上以上叙述有时候不会成功 ( 原因不详 ), ? 为了能够成功地改变预设打印机, ? 以下是呼叫 Windows ? API ? 的方法: ( ? 此一解决方案适用於 ? Windows ? 95,98) ? 1. ? API ? 的宣告:Const ? HWND_BROADCAST ? = ? &HFFFF&Const ? WM_WININICHANGE ? = ? &H1A ? Private ? Declare ?
3、 Function ? GetProfileString ? Lib ? "kernel32" ? Alias ? ? _ ? "GetProfileStringA" ? (ByVal ? lpAppName ? As ? String, ? ByVal ? lpKeyName ? As String, ? ByVal ? lpDefault ? As ? String, ? ByVal ? lpReturnedString ? As ? String, ? ByVal ? nSize ? As ? Long) ? As ? Long ? Private
4、 ? Declare ? Function ? WriteProfileString ? Lib ? "kernel32" ? Alias ? _ ? "WriteProfileStringA" ? (ByVal ? lpszSection ? As ? String, ? ByVal ? lpszKeyName As ? String, ? ByVal ? lpszString ? As ? String) ? As ? Long ?Private ? Declare ? Function ? SendMessage ? Lib ? "use
5、r32" ? Alias ? "SendMessageA" ? (ByVal ? hwnd ? As ? Long, ? ByVal ? wMsg ? As ? Long, ? ByVal ? wParam ? As ? Long, ? ? lParam ? As ? Any) ? As ? Long ? 2. ? 程式范例: ? PrinterName ? = ? " 您想设定的打印机名称Dim ? S ? As ? String, ? length ? As ? Long, ? hKey ? As ? LongS ? = ? String(80, ?
6、 Chr(0) ?length ? = ? GetProfileString("devices", ? PrinterName, ? "", ? S, ? Len(S) ?S ? = ? Left(S, ? length) ?Call ? WriteProfileString("windows", ? "device", ? PrinterName ? & ? "," ? & ? S) ?Call ? SendMessage(HWND_BROADCAST, ? WM_WININI
7、CHANGE, ? &H7FFF&, ? ByVal ? "windows")? ? 至於改变 ? NT ? 预设打印机的方法, ? 则是改变登录资料库 (Registry) 打印机的设定, ? 在登录资料库中纪录 ? ? 预设打印机的 ? Value ? 是: ?HKEY_CURRENT_USER ?SoftwareMicrosoftWindowsNTCurrentVersionWindows ? subkey ?的 Device ? value ?(3) VB中获取指定打印机的各种纸张类型及大小放入一个 MSFlexGrid ,名称为 fgd1 ,列数为
8、 4'Option?ExplicitPrivate?Const?DC_MAXEXTENT?=?5Private?Const?DC_MINEXTENT?=?4Private?Const?DC_PAPERNAMES?=?16Private?Const?DC_PAPERS?=?2Private?Const?DC_PAPERSIZE?=?3Private?Declare?Function?DeviceCapabilities?Lib?"winspool.drv"?Alias?"DeviceCapabilit iesA"?(ByVal?lpDeviceNa
9、me?As?String,?ByVal?lpPort?As?String,?ByVal?iIndex?As?Long,?lp Output?As?Any,?lpDevMode?As?Any)?As?LongPrivate?Type?POINTS?x?As?Long?y?As?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?
10、.AllowUserResizing?=?flexResizeColumns?.Left?=?0?.Width?=?Me.ScaleWidthEnd?WithGetPaperInfoEnd?SubPrivate?Sub?GetPaperInfo()Dim?i?As?Long,?ret?As?LongDim?Length?As?Integer,?Width?As?IntegerDim?PaperNo()?As?Integer,?PaperName()?As?String,?PaperSize()?As?POINTS' 支持最大打印纸:ret?=?DeviceCapabilities( 打
11、印机名称 ,?"LPT1",?DC_MAXEXTENT,?ByVal?0&,?ByVal?0&)Length?=?ret?65536Width?=?ret?-?Length?*?65536'lblMaxLength.Caption?=?Length'lblMaxWidth.Caption?=?Width' 支持最小打印纸:ret?=?DeviceCapabilities( 打印机名称 ,?"LPT1",?DC_MINEXTENT,?ByVal?0&,?ByVal?0&) Length?=?ret?6
12、5536Width?=?ret?-?Length?*?65536' 支持纸张种类数ret?=?DeviceCapabilities( 打印机名称 ,?"LPT1",?DC_PAPERS,?ByVal?0&,?ByVal?0&)' 纸张编号ReDim?PaperNo(1?To?ret)?As?IntegerCall?DeviceCapabilities( 打印机名称 ,?"LPT1",?DC_PAPERS,?PaperNo(1),?ByVal?0&)' 纸张名称Dim?arrPageName()?As?Byt
13、eDim?allNames?As?StringDim?lStart?As?Long,?lEnd?As?LongReDim?PaperName(1?To?ret)?As?String ReDim?arrPageName(1?To?ret?*?64)?As?ByteCall?DeviceCapabilities( 打印机名称 ,?"LPT1",?DC_PAPERNAMES,?arrPageName(1),?ByVal?0&) allNames?=?StrConv(arrPageName,?vbUnicode) 'loop?through?the?string?a
14、nd?search?for?the?names?of?the?papersi?=?1Do?lEnd?=?InStr(lStart?+?1,?allNames,?Chr$(0),?vbBinaryCompare) ?If?(lEnd?>?0)?And?(lEnd?-?lStart?-?1?>?0)?Then ?PaperName(i)?=?Mid$(allNames,?lStart?+?1,?lEnd?-?lStart?-?1)?i?=?i?+?1?End?If?lStart?=?lEndLoop?Until?lEnd?=?0' 纸张尺寸ReDim?PaperSize(1?T
15、o?ret)?As?POINTSCall?"LPT1",?DC_PAPERSIZE,?PaperSize(1),?ByVal?0&)' 显示在表格中For?i?=?1?To?ret?fgd1.AddItem?PaperNo(i)?&?vbTab?&?PaperName(i)?&?vbTab?&?PaperSize(i).y?&?vbTab?& ?PaperSize(i).xNext?i' 移除第一个空行fgd1.Row?=?1fgd1.RemoveItem?1End?SubPrivate?Sub?For
16、m_Resize()With?fgd1?.Left?=?0?.Width?=?Me.ScaleWidth?.Height?=?Me.ScaleHeight?.Top?=?0En d?WithEnd?Sub(5)编写VB打印控制程序的几点心得摘 要 本文在总结作者实际开发经验的基础上,详细介绍了VB实现高分辨率打印方法的几点心得。阐述了参数化绘图程序缩短打印程序开发时间的方法以及打印机缩放属性与 窗体属性匹配使用的技巧,并总结了解决坐标定位、图形与其实际打印位置出现误差 等问题的经验。关键词PrintForm高分辨率打印参数化绘图缩放属性Some Experiences on VB Print
17、ControlBai Yang, Wang PengComputer Scie nee Departme ntUni versity of In formati on and Engin eeri ngZhen gzhou, ChinaAbstract : On the basis of our working experiences, wehave given a detail descriptionabout VB print method ofhigh resolution. We focus onhow to shortendeveloping periodwith parameter
18、ized plot program, the match betwee n the zoom attribute and the attribute of display win dow etc.,which based on print program of Prin ter Object .In additi on tothis, we have in troduced some experie nces on deali ng with positi on error that caused by the mismatch betwee n font and graph on scree
19、 n and that on prin ter.Keywords: PrintForm, High Resolution Print, parameterized plot,zoomattribute1.简介Visual Basic( VB)给用户提供了可视化编程环境,因其简单易学、功能强大而得到了广泛的应用。VB提供了两种实现打印的方法。一般在对打印质量要求不高的场合,或者是编程项目的 早期开发过程中,可以直接使用VB窗体的Printform 方法实现打印。用这种方法实现打印具有编程简单、易用并且功能强大的优点,它只需要通过一行代码,几乎能打印所有内容。实现的方法就是:首先将要打印的内容在屏
20、幕上显示出来,然后开发人员只要为窗体对象激活PrintForm ,窗体则自动将要打印的内容发送到Printer对象上,其语法格式如下:窗 体.PrintForm。如果窗体中包括图形,那么打印前应先置窗体的AutoRedraw属性为真。这种方法虽然简单,但是它却存在着内存消耗大、打印粗糙、速度慢等缺陷,尤其对于带有滚动条的图 像,这种方法只能打印当前可视的区域。在实际应用中经常会遇到对打印质量要求很高的场合, 例如打印音乐五线谱,对打印的美观、清晰度以及音符符头的位置都有很严格的要求,这种应用 场合若采用VB提供的另一种基于Printer对象的打印方法则可以获得高分辨率的打印,得到很高的打印质量
21、。在实际应用中,也可以根据实际应用情况将上述两种方法结合起来使用,即:前期 工作使用PrintForm 简单的打印方法将窗体的布局定下来,后期再使用基于Printer对象的打印方法实现最终的打印工作。2.高分辨率打印程序开发心得Prin ter 对象VB的打印可以使用 Printer对象。Printer对象是一个独立于打印机设备的封装,它可以代 表不同的打印机,初始时,Prin ter对象为系统缺省的打印机,也可以使用下列语句:SetPrinter=Printers(2)(其中2代表Printers 集中的第二个打印机)对打印机进行指定。Printer 对象具备例如: ColorMode、Co
22、pies、Duplex、Printquality等控制打印机特征的属性,提供了 Newpage EndDoc KillDoc等控制打印过程的方法,以及大多数由窗体和图片框控件 提供的图形属性和方法如:Currentx、Currenty、Textwidth、Textheight 、Print、Pset、Line、PaintPicture和Circle等方法,它还拥有 Font的所有属性。实现高分辨率的打印就是通过控制Printer对象的上述属性和方法完成的。直接利用 Windows公用标准对话框CommonDialog控件【打印】VB为用户提供了 Win dows公用标准对话框Com mon D
23、ialog控件:【打开】、【文件另存为】、【颜色】、【字体】、【打印】。Com mon Dialog控件在Visual Basic 和Microsoft Win dows 动态连接库Commdlg.dll例程之间提供了接口。利用公用标准对话框【打印】开发VB的打印程序,将大大缩短程序的开发周期。应用程序中要使用公用对话框,必须首先在工具箱中添加公用对话框 控件。该动作通过激活【部件】对话框,选中 Microsoft CommoDialog Control6.0,单击【确定】即可。然后再将公用控件添加到窗体上并设置相应属性,该控件具有的属性有Color、Font、Print、Help 等。VB提
24、供mnuFilePrint_Click ()过程供用户添加开发的打印程序代码。Printer对象控制打印的基本过程利用Printer对象开发的打印程序主要靠其提供的NewPage (打印新的一页,CurrentX、CurrentY置为新页的左上角,可完成多页功能。)、EndDoc(将打印任务加入打印机队列)、KillDoc(取消打印任务)控制打印过程的。一般情况下,打印程序完成多页打印时会多次执行NewPage,结束时执行一次EndDoc将打印任务加入 打印机队列。如果你在NewPage后,立即使用EndDoc, VB则不会打印额外的空白 页。如果希望显示空白页,则可在新的一页上只使用Prin
25、 ter.Pri nt打印空字符即可。为了通过Printer对象实现文本和图形的打印,获得最好的打印质量,还需要对VB控制打印机的多种属性有更深入的理解,例如打印机的坐标体系向屏幕坐标体系的转 换、打印机字体尺寸的确定等。下面给出了打印程序的主框架:Private Sub mn uFilePri nt_Click()On Error Resume NextIf ActiveForm Is Nothi ngThe n Exit SubWith dlgCom mon Dialog'打印机公用对话框.DialogTitle ="打印".Ca ncelError = Tru
26、e.Flags = 1Prin ter.F on tSize = dlgCom mon Dialog.F on tSize'将打印机公用对话框设置的字体大小传递给打印 机.ShowPri nter在屏幕上显示【打印】公用对话框If Err <> MSComDIg.cdICa ncel The nPrin ter.F on tTra nspare nt :=False'初始化打印的字体为不透明SetPri nterScaleMyform'匹配打印机的缩放属性与窗体的属性PrintAny where Prin ter'可放置用户编写的打印对象参数化例程&
27、#39;实现字符和图形的显示Prin ter.NewPage'打印机坐标初始化PrintAny where Prin ter打印另一页的内容Prin ter.NewPage'打印机坐标初始化Prin ter.E ndDoc'将该任务加入打印机任务队列不打印空白页Prin ter.KillDoc'取消当前的打印任务End IfEnd WithEnd Sub参数化绘图程序用VB开发应用程序时,如果使用参数化绘图例程进行屏幕显示程序的开发,则在 开发打印程序时,就不需再另行开发代码,从而避免了大量的重复劳动,有效地缩短 了程序的开发周期。参数化绘图例程就是:在开发例程
28、时,为每一个例行程序提供一 个OBJEC类型的参数,调用程序通过向例程的OBJEC类型参数分别传递窗体、Prin ter对象,就可分别完成屏幕显示与打印机输出。见如下示例:Sub PrintAnywhere( Dest As Object )Dest.Pri nt“ HELLO”Dest Is Prin terThe nPrin ter.E ndDocEnd IfEnd Sub要完成屏幕上的输出,调用PrintAnywhere Myform 即可,而调用PrintAnywhere Printer则完成在打印机上输出。属性匹配与窗体缩放因为控制打印机实际绘图区域大小的属性Height和Width
29、,由目前正在使用的纸张决定,而且可打印的区域与纸张边缘有一定距离。因而为了获得正确的打印输出结 果,不能简单地将Printer对象直接传递给绘图例行程序,还必须要解决打印机的缩 放属性与显示窗体属性相匹配的 问题。即:保证使窗体中的打印内容以正确的大小显 示,并居于可打印区域的中间。实际上实现的是打印机的坐标体系向屏幕坐标体系的 转换。具体过程是:使用打印机的 ScaleX和ScaleY方法,获取以twip为单位的打印 机尺寸,再利用窗体的ScaleX和ScaleY方法将这些尺寸转换为窗体中的坐标系统,从 而实现以窗体的坐标系统提供打印机可打印区域大小的目的。然后,用这些尺寸作为 打印机中新的
30、ScaleWidth和ScaleHeight,即可实现属性匹配。但是,我们在打印时,经常会遇到这样的场合一一在不改变窗体形状的情况下, 需要扩大或缩小窗体的大小。要完成这样的工作,不仅需要完成属性匹配,还要确定 对象被缩放的系数。程序如下:Private Sub SetPri nterScale(obj As Object)Dim pwid As Single, phgt As Single, xmid As Single, ymid As SingleDim owid As Si ngle, ohgt As Si ngleowid = obj.ScaleX(obj.ScaleWidth, o
31、bj.ScaleMode, vbTwips)ohgt = obj.ScaleY(obj.ScaleHeight, obj.ScaleMode, vbTwips)获取窗体以Twips表示的尺寸pwid = Prin ter.ScaleX(Pri nter.ScaleWidth, Prin ter.ScaleMode, vbTwips)phgt = Prin ter.ScaleY(Pri nter.ScaleHeight, Prin ter.ScaleMode, vbTwips)'获取打印机以Twips表示的尺寸If (ohgt / owid > phgt / pwid) Thens
32、 = phgt / ohgtElses = pwid / owidEnd If'计算缩放因子pwid = obj.ScaleX(pwid, vbTwips, obj.ScaleMode) / sphgt = obj.ScaleY(phgt, vbTwips, obj.ScaleMode) / s'将打印机的尺寸转换成obj的坐标系统/缩放因子x_mid = obj.ScaleLeft + obj.ScaleWidth / 2y_mid = obj.ScaleTop + obj.ScaleHeight / 2'设置打印区域的中心点坐标Prin ter.Scale (x_m
33、id - pwid / 2, y_mid - phgt / 2)-(x_mid + pwid / 2, y_mid + phgt /2) 设置打印机中新的ScaleWidth和ScaleHeightEnd Sub(6)?坐标定位窗体、图片框控件以及Printer对象提供的TextWidth和TextHeight方法在文本定 位的应用方面很有用。TextWidth、TextHeight分别以对象当前的刻度单位返回字符 串的宽度和高度。但是必须注意很多字体中其字符宽度并不全部相同,所以不能简单 地将单个字符的宽度乘以字符数来获得字符串的宽度。对那些没有TextWidth和TextHeight的控件
34、可通过设置父窗体的Font属性,使其与该控件的属性相匹配,再利 用父窗体的TextWidth和TextHeight获得它的字符串的宽度和高度。但是,我们在完成屏幕显示程序调试后,在进行打印输出时却出现了屏幕显示与 打印结果的不一致性的现象,表现在所打印的字体之间坐标关系与屏幕显示不一样, 例如:屏幕显示上的两个字符不重叠,而打印出的字符却出现相互重叠的现象。经调试发现,问题出现在字体尺寸的确定上。程序中,屏幕上显示的字符坐标是通过对象 的TextWidth和TextHeight方法计算得来的,它直接受到字体尺寸大小的 影响。VB向 用户提供的字体是在用户需要的打印机点的范围内,如果你需要的字体
35、大小为73点,则打印出的实际字体大小为72.75。然而窗体、图片框控件的Fontsize只能是整数,例 如它不能将字体的大小定为72.75,实际上这就造成了屏幕上显示字体与实际打印字 体大小之间产生了误差。我们采用如下方法来解决该问题,就是在计算字体大小时, 根据计算出来的字体尺寸,确定它存在的范围,然后再将它定位到VB提供的几种固定大小的字体上,而不是随意指定。当然,也可以有其它的解决办法。例如:字体大小 选取偶数等。由于篇幅所限,这里不再作介绍。以上是笔者在总结实际应用工作中的一些心得与体会,希望本篇文章能对首次使用 VB开发打印程序的设计人员有所帮助。(6)VB中不是有 Printers
36、集合吗??写个For ? Each循环就能枚举Printers集合中的所有打印机? Printer ?对象和 ? Printers ?集合?使用? Printer ?对象可以实现与系统打印机的通讯(最初是缺省系统打印机)。?用? Printers ?集合可获取有关系统上所有可用打印机的信息。?语法?? Printer ? Printers(index) ? index ?所在处表示从 ? 0 ?至U ? Printers.Count-1 ?之间的整数。?说明??用图形方法在 ? Printer ?对象上绘制文本和图形。一旦? Printer ?对象中含有将要打印的输出信息,可用EndDoc ?
37、方法直接将输岀信息送到应用程序的缺省打印机上。? PrintForm ?方法打印窗体,?如果要打印这些信息,应该检查和可能还要修正窗体的布局。例如,如果用 则到页底图形图象可能被剪切,而文本则被移到下一页。?? Printers ?集合可用来查询可用的打印机,这样就可以为应用程序指定一台缺省打印机。例如也许要找出哪 些可用打印机用了指定的打印驱动程序。下面的代码查找所有的可用打印机,定位在第一个将页码方向设置为纵向的打印机,然后将其设置为? Portrait o? Dim ? X ? As ? Printer ? For ? Each ? X ? In ? Printers ? ? ? ? If ? X.Orientation ? = ? vbPRORPortrait ?
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二年级上册数学教案-练习七-北师大版
- 六年级上册数学教案-3.1 倒-数 |西师大版
- 六年级下册数学教案-4.1扇形统计图的认识 ︳西师大版
- 三年级上册数学教案-解决问题第一课时|苏教版
- 六年级上册数学教案 -2.1 分数混合运算|北师大版
- 融资担保培训协议书(2篇)
- 北师大版数学三年级上册单元测试卷-第三单元-加与减(含答案)
- 2024年血压调节用品项目资金筹措计划书代可行性研究报告
- 2025年度两人共同投资可再生能源项目的股份合作合同
- 2025年度合伙人退出与合作伙伴关系维护协议
- 拉线的制作详细
- 律师报价函(诉讼)
- 新生儿沐浴评分标准
- 潜水作业指导书
- (完整版)设计管理
- 感谢对手阅读附答案
- 材料性能学(第2版)付华课件0-绪论-材料性能学
- GB/T 8012-2000铸造锡铅焊料
- 第一课 第一章 AutoCAD 2012概述入门
- 2023年湖南省普通高中学业水平考试数学版含答案
- 超市店长考核方案(实例)
评论
0/150
提交评论