(1)
假设你的COMMONDIALOG控件叫CMDiag
用如下代码可以使你选择的打印机成为默认打印机"Printer"
On Error Resume Next
CMDiag.PrinterDefault=True
CMDiag.CancelError=True
CMDiag.ShowPrinter
If Err.Number<>0Then Exit Sub
(2)
VB里面,原本改变预设打印机的方法是:(假设安装有两种打印机(驱动程式))
Set Printer=Printers(0)'将预设打印机设定成第一种打印机
Set Printer=Printers(1)'将预设打印机设定成第二种打印机
但实际上以上叙述有时候不会成功(原因不详),为了能够成功地改变预设打印机,
以下是呼叫Windows API的方法:(此一解决方案适用於Windows95,98)
1.API的宣告:
Const HWND_BROADCAST=&HFFFF&
Const WM_WININICHANGE=&H1A
Private Declare 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 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"user32"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 Long
S=String(80,Chr(0))
length=GetProfileString("devices",PrinterName,"",S,Len(S))
S=Left(S,length)
Call WriteProfileString("windows","device",PrinterName&","&S)
Call SendMessage(HWND_BROADCAST,WM_WININICHANGE,&H7FFF&,ByVal"windows")
至於改变NT预设打印机的方法,则是改变登录资料库(Registry)打印机的设定,
在登录资料库中纪录
预设打印机的Value是:
HKEY_CURRENT_USER
\Software\Microsoft\WindowsNT\CurrentVersion\Windows subkey的Device value
(3)VB中获取指定打印机的各种纸张类型及大小
放入一个MSFlexGrid,名称为fgd1,列数为4
'Option Explicit
Private Const DC_MAXEXTENT=5
Private Const DC_MINEXTENT=4
Private Const DC_PAPERNAMES=16
Private Const DC_PAPERS=2
Private Const DC_PAPERSIZE=3
Private Declare Function DeviceCapabilities Lib"winspool.drv"Alias"De viceCapabilitiesA"(ByVal lpDeviceName As String,ByVal lpPort As Strin g,ByVal iIndex As Long,lpOutput As Any,lpDevMode As Any)As Long Private Type POINTS
x As Long
y As Long
End Type
Private Sub Form_Load()
Dim i As Long
With fgd1
.Clear
.FormatString="^纸张编号|^纸张名称|^纸张长度|^纸张宽度"
For i=0To.Cols-1
.ColWidth(i)=1700
Next i
.AllowUserResizing=flexResizeColumns
.Left=0
.Width=Me.ScaleWidth
End With
GetPaperInfo
End Sub
Private Sub GetPaperInfo()
Dim i As Long,ret As Long
Dim Length As Integer,Width As Integer
Dim PaperNo()As Integer,PaperName()As String,PaperSize()As POINTS '支持最大打印纸:
ret=DeviceCapabilities(打印机名称,"LPT1",DC_MAXEXTENT,ByVal0&,ByVal0&)
Length=ret\65536
Width=ret-Length*65536
'lblMaxLength.Caption=Length
'lblMaxWidth.Caption=Width
'支持最小打印纸:
ret=DeviceCapabilities(打印机名称,"LPT1",DC_MINEXTENT,ByVal0&,ByVal0&)
Length=ret\65536
Width=ret-Length*65536
'支持纸张种类数
ret=DeviceCapabilities(打印机名称,"LPT1",DC_PAPERS,ByVal0&,ByVal0&)
'纸张编号
ReDim PaperNo(1To ret)As Integer
Call DeviceCapabilities(打印机名称,"LPT1",DC_PAPERS,PaperNo(1),ByVal0&)
'纸张名称
Dim arrPageName()As Byte
Dim allNames As String
Dim lStart As Long,lEnd As Long
ReDim PaperName(1To ret)As String
ReDim arrPageName(1To ret*64)As Byte
Call DeviceCapabilities(打印机名称,"LPT1",DC_PAPERNAMES,arrPageName(1),ByVal0&)
allNames=StrConv(arrPageName,vbUnicode)
'loop through the string and search for the names of the papers
i=1
Do
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=lEnd
Loop Until lEnd=0
'纸张尺寸
ReDim PaperSize(1To ret)As POINTS
Call DeviceCapabilities(Form2.Combo1.Text,"LPT1",DC_PAPERSIZE,PaperSize( 1),ByVal0&)
'显示在表格中
For i=1To ret
fgd1.AddItem PaperNo(i)&vbTab&PaperName(i)&vbTab&Paper Size(i).y&vbTab&PaperSize(i).x
Next i
'移除第一个空行
fgd1.Row=1
fgd1.RemoveItem1
End Sub
Private Sub Form_Resize()
printformWith fgd1
.Left=0
.Width=Me.ScaleWidth
.Height=Me.ScaleHeight
.Top=0
End With
End Sub
(5)编写VB打印控制程序的几点心得
摘要本文在总结作者实际开发经验的基础上,详细介绍了VB实现高分辨率打印方法的几点心得。阐述了
参数化绘图程序缩短打印程序开发时间的方法以及打印机缩放属性与窗体属性匹配使用的技巧,并总结了解决坐标定位、图形与其实际打印位置出现误差等问题的经验。
关键词PrintForm高分辨率打印参数化绘图缩放属性
Some Experiences on VB Print Control
Bai Yang,Wang Peng
Computer Science Department
University of Information and Engineering
Zhengzhou,China
Abstract:On the basis of our working experiences,we have given a detail description about VB print method of high resolution.We focus on how to shorten developing period with parameterized plot program,the match between the zoom attribute and the attribute of display window etc.,which based on print program of 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 screen and that on printer.
Keywords:PrintForm,High Resolution Print,parameterized plot,zoom attribute
1.简介
Visual Basic(VB)给用户提供了可视化编程环境,因其简单易学、功能强大而得到了广泛的应用。VB提供了两种实现打印的方法。一般在对打印质量要求不高的场合,或者是编程项目的早期开发过程中,可以直接使用VB窗体的Printform方法实现打印。用这种方法实现打印具有编程简单、易用并且功能强大的优点,它只需要通过一行代码,几乎能打印所有内容。实现的方法就是:首先将要打印的内容在屏幕上显示出来,然后开发人员只要为窗体对象激活PrintForm,窗体则自动将要打印的内容发送到Printer对象上,其语法格式如下:[窗体.]PrintForm。如果窗体中包括图形,那么打印前应先置窗体的AutoRedraw属性为真。这种方法虽然简单,但是它却存在着内存消耗大、打印粗糙、速度慢等缺陷,尤其对于带有滚动条的图像,这种方法只能打印当前可视的区域。在实际应用中经常会遇到对打印质量要求很高的场合,例如打印音乐五线谱,对打印的美观、清晰度以及音符符头的位置都有很严格的要求,这种应用场合若采用VB提供的另一种基于Printer 对象的打印方法则可以获得高分辨率的打印,得到很高的打印质量。在实际应用中,也可以根据实际应用情况将上述两种方法结合起来使用,即:前期工作使用PrintForm简单的打印方法将窗体的布局定下来,后期再使用基于Printer对象的打印方法实现最终的打印工作。
2.高分辨率打印程序开发心得
⑴Printer对象
VB的打印可以使用Printer对象。Printer对象是一个独立于打印机设备的封装,它可以代表不同的打印机,初始时,Printer对象为系统缺省的打印机,也可以使用下列语句:Set Printer=Printers(2)(其中2代表Printers集中的第二个打印机)对打印机进行指定。
Printer对象具备例如:ColorMode、Copies、Duplex、Printquality等控制打印机特征的属性,提供了Newpage、EndDoc、KillDoc等控制打印过程的方法,以及大多数由窗体和图片框控件提供的图形属性和方法如:Currentx、Currenty、Textwidth、Textheight、Print、Pset、Line、PaintPicture和Circle等方法,它还拥有Font的所有属性。实现高分辨率的打印就是通过控制Printer对象的上述属性和方法完成的。
⑵直接利用Windows公用标准对话框CommonDialog控件【打印】
VB为用户提供了Windows公用标准对话框CommonDialog控件:【打开】、【文件另存为】、【颜】、【字体】、【打印】。CommonDialog控件在Visual Basic和Microsoft Windows动态连接库Commdlg.dll例程之间提供了接口。利用公用标准对话框【打印】开发VB的打印程序,将大大缩短程序的开发周期。应用程序中要使用公用对话框,必须首先在工具箱中添加公用对话框控件。该动作通过激活【部件】对话框,选中Microsoft Common Dialog Control6.0,单击【确定】即可。然后再将公用控件
添加到窗体上并设置相应属性,该控件具有的属性有Color、Font、Print、Help等。
VB提供mnuFilePrint_Click()过程供用户添加开发的打印程序代码。
⑶Printer对象控制打印的基本过程

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。