1 / 13
文档名称:

VB中打印机选择.docx

格式:docx   大小:66KB   页数:13页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

VB中打印机选择.docx

上传人:雨林书屋 2022/12/3 文件大小:66 KB

下载得到文件列表

VB中打印机选择.docx

文档介绍

文档介绍:该【VB中打印机选择 】是由【雨林书屋】上传分享,文档一共【13】页,该文档可以免费在线阅读,需要了解更多关于【VB中打印机选择 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。精选文档
精选文档
1
精选文档
.
1)
假定你的COMMONDIALOG控件叫CMDiag
用以下代码能够使你选择的打印机成为默认打印机"Printer"
OnErrorResumeNext
=True
=True

<>0ThenExitSub
2)
VB里面,本来改变预设打印机的方法是:(假定安装有两种打印机(驱动程式))
SetPrinter=Printers(0)'将预设打印机设定成第一种打印机
SetPrinter=Printers(1)'将预设打印机设定成第二种打印机
但实质上以上表达有时不会成功(原由不详),为了能够成功地改变预设打印机,
以下是呼喊WindowsAPI的方法:(此一解决方案适用於Windows95,98)
:
ConstHWND_BROADCAST=&HFFFF&
ConstWM_WININICHANGE=&H1A
PrivateDeclareFunctionGetProLib"kernel32"Alias_
"GetPro"(ByVallpAppNameAsString,ByVallpKeyNameAs_
String,ByVallpDefaultAsString,ByVallpReturnedStringAsString,_
ByValnSizeAsLong)AsLong
PrivateDeclareFunctionWriteProLib"kernel32"Alias_
"WritePro"(ByVallpszSectionAsString,ByVallpszKeyName_
AsString,ByVallpszStringAsString)AsLong
PrivateDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"_
(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,_
lParamAsAny)AsLong
程式典范:
PrinterName="您想设定的打印机名称"
DimSAsString,lengthAsLong,hKeyAsLong
S
=
String(80,
Chr(0))
length
=GetPro("devices",
PrinterName,"",
S,
Len(S))
S
=
Left(S,
length)
精选文档
精选文档
2
精选文档
Call
WritePro("windows",
"device",PrinterName
&
","
&
S)
..
精选文档
精选文档
13
精选文档
.
CallSendMessage(HWND_BROADCAST,WM_WININICHANGE,&H7FFF&,ByVal"windows")
至於改变NT预设打印机的方法,则是改变登录资料库(Registry)打印机的设定,
在登录资料库中纪录
预设打印机的Value是:
HKEY_CURRENT_USER
\Software\Microsoft\WindowsNT\CurrentVersion\Windowssubkey的Devicevalue
3)VB中获取指定打印机的各样纸张种类及大小
放入一个MSFlexGrid,名称为fgd1,列数为4
'Option
Explicit
Private
Const
DC_MAXEXTENT=
5
Private
Const
DC_MINEXTENT=4
Private
Const
DC_PAPERNAMES=
16
Private
ConstDC_PAPERS=2
Private
Const
DC_PAPERSIZE=
3
Private
Declare
Function
DeviceCapabilities
Lib
""
Alias
"De
viceCapabilitiesA"
(ByVal
lpDeviceName
As
String,
ByVal
lpPort
As
Strin
g,ByVal
iIndex
AsLong,
lpOutput
As
Any,lpDevMode
AsAny)
As
Long
Private
TypePOINTS
AsLong
AsLong
End
Type
Private
Sub
Form_Load()
Dim
i
As
Long
With
fgd1
.Clear
.FormatString
=
"^纸张编号|^纸张名称|^纸张长度|^纸张宽度"
For
i
=
0
To
.Cols
-1
.ColWidth(i)
=
1700
Next
i
.AllowUserResizing
=flexResizeColumns
.Left
=
0
.Width
=

End
With
GetPaperInfo
End
Sub
Private
Sub
GetPaperInfo()
Dim
i
As
Long,
ret
As
Long
Dim
Length
As
Integer,
Width
AsInteger
Dim
PaperNo()
As
Integer,
PaperName()AsString,
PaperSize()
AsPOINTS
支持最大打印纸:
精选文档
精选文档
4
精选文档
..
精选文档
精选文档
13
精选文档
.
ret=DeviceCapabilities(打印机名
称,"LPT1",DC_MAXEXTENT,ByVal0&,ByVal0&)Length=ret\65536
Width=ret-Length*65536
'=Length
'=Width
支持最小打印纸:
ret=DeviceCapabilities(打印机名
称,"LPT1",DC_MINEXTENT,ByVal0&,ByVal0&)Length=ret\65536
Width=ret-Length*65536
支持纸张种类数
ret
=
DeviceCapabilities(




称,
"LPT1",
DC_PAPERS,ByVal
0&,
ByVal
0&)
'纸张编号
ReDim
PaperNo(1Toret)As
Integer
Call
DeviceCapabilities(




称,
"LPT1",
DC_PAPERS,PaperNo(1),
ByVal
0&)
纸张名称
Dim
arrPageName()
As
Byte
Dim
allNames
AsString
Dim
lStart
AsLong,
lEnd
As
Long
ReDim
PaperName(1
To
ret)
As
String
ReDim
arrPageName(1
Toret
*
64)As
Byte
Call
DeviceCapabilities(




称,
"LPT1",
DC_PAPERNAMES,arrPageName(1),
ByVal
0&)
allNames=
StrConv(arrPageName,
vbUnicode)
'loop
through
the
string
and
search
for
the
namesofthe
papers
=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
'纸张尺寸
ReDimPaperSize(1
To
ret)
As
POINTS
CallDeviceCapabilities(,"LPT1",DC_PAPERSIZE,PaperSize(
1),ByVal0&)
显示在表格中
精选文档
精选文档
6
精选文档
..
精选文档
精选文档
13
精选文档
.
Fori=1Toret
(i)&vbTab&PaperName(i)&vbTab&Paper
Size(i).y&vbTab&PaperSize(i).x
Nexti
移除第一个空行
=1

EndSub
PrivateSubForm_Resize()
Withfgd1
.Left=0
.Width=
.Height=
.Top=0
EndWith
EndSub
(5)编写VB打印控制程序的几点心得
纲要本文在总结作者实质开发经验的基础上,详尽介绍了VB实现高分辨率打印方法
的几点心得。论述了参数化画图程序缩短打印程序开发时间的方法以及打印机缩放属性与窗体属性般配使用的技巧,并总结认识决坐标定位、图形与其实质打印地址出现偏差等问题的经验。
要点词PrintForm高分辨率打印参数化画图缩放属性
SomeExperiencesonVBPrintControl
BaiYang,WangPeng
ComputerScienceDepartment
UniversityofInformationandEngineering
Zhengzhou,China
Abstract:Onthebasisofourworkingexperiences,wehavegivenadetail

developingperiodwithparameterizedplotprogram,thematchbetweenthezoom
attributeandtheattributeofdisplaywindowetc.,whichbasedonprintprogram
,wehaveintroducedsomeexperiencesondealingwithpositionerrorthatcausedbythemismatchbetweenfontandgraphonscreenandthatonprinter.
Keywords:PrintForm,HighResolutionPrint,parameterizedplot
,zoom
attribute

精选文档
精选文档
8
精选文档
..
精选文档
精选文档
13
精选文档
.
VisualBasic(VB)给用户供给了可视化编程环境,因其简单易学、功能强盛而获取了宽泛的应用。VB供给了两种实现打印的方法。一般在对打印质量要求不高的场合,或许
是编程项目的初期开发过程中,能够直接使用
VB窗体的Printform
方法实现打印。用这类
方法实现打印拥有编程简单、易用并且功能强盛的长处,它只需要经过一行代码,
几乎能打
印所有内容。实现的方法就是:第一将要打印的内容在屏幕上显示出来
,而后开发人员只需
为窗体对象激活
PrintForm,窗体则自动将要打印的内容发送到Printer对
象上,其语法格式以下:[窗体.]PrintForm
。假如窗体中包含图形,那么打印前应先置窗
体的AutoRedraw属性为真。这类方法固然简单,可是它却存在着内存耗费大、打印粗拙、
速度慢等缺点,特别关于带有转动条的图像,
这类方法只好打印目前可视的地区。
在实质应
用中常常会碰到对打印质量要求很高的场合,
比方打印音乐五线谱,对打印的雅观、清楚度
以及音符符头的地址都有很严格的要求,
这类应用处合若采纳VB供给的另一种鉴于Printer
对象的打印方法例能够获取高分辨率的打印,
获取很高的打印质量。
在实质应用中,也能够
依据实质应用状况将上述两种方法结合起来使用,即:先期工作使用
PrintForm
简单的打
印方法将窗体的布局定下来,后期再使用鉴于
Printer对象的打印方法实现最后的打印工
作。

Printer对象
VB的打印能够使用
Printer
对象。Printer对象是一个独立于打印机设施的封装,它
能够代表不一样的打印机,
初始时,Printer
对象为系统缺省的打印机,也能够使用以下语句:
SetPrinter=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

例程之间供给了接口。利用公用标准对话框【打印】开发
VB的打印程序,将大大缩短程序的开发周期。应用程序中要使用公用对话框,一定第一在
工具箱中增加公用对话框控件。该动作经过激活【部件】对话框,选中
MicrosoftCommon
,
单击【确立】即可。而后再将公用控件增加到窗体上并设置相应属性,
该控件拥有的属性有
Color、Font、Print、Help等。
VB供给mnu()过程供用户增加开发的打印程序代码。
⑶Printer对象控制打印的基本过程
精选文档
精选文档
10
精选文档
..
精选文档
精选文档
13
精选文档
.
利用Printer对象开发的打印程序主要靠其供给的——NewPage(打印新的一页,CurrentX、CurrentY置为新页的左上角,可达成多页功能。)、EndDoc(将打印任务加入打印机行列)、KillDoc(撤消打印任务)控制打印过程的。一般状况下,打印程序达成多页打印时会多次履行NewPage,结束时履行一次EndDoc将打印任务加入打印机行列。假如你在NewPage后,马上使用EndDoc,VB则不会打印额外的空白页。假如希望显示空白页,“打“印空字符即可。
为了经过Printer对象实现文本和图形的打印,获取最好的打印质量,还需要
对VB控制打印机的多种属性有更深入的理解,比方打印机的坐标系统向屏幕坐标系统的变换、打印机字体尺寸的确定等。下边给出了打印程序的主框架:
PrivateSubmnuClick()
OnErrorResumeNext
IfActiveFormIsNothingThenExitSub
WithdlgCommonDialog‘打印机公用对话框
.DialogTitle="打印"
.CancelError=True
.Flags=1
=
‘将打印机公用对话框设置的字体大小传达
给打印机
.ShowPrinter‘在屏幕上显示【打印】公用对话框
IfErr<>
=False‘初始化打印的字体为
不透明
SetPrinterScaleMyform‘般配打印机的缩放属性与窗体
的属性
PrintAnywherePrinter‘可搁置用户编写的打印对象
参数化例程
‘实现字符和图形的显示
‘打印机坐标初始化
PrintAnywherePrinter‘打印另一页的内容
‘打印机坐标初始化
‘将该任务加入打印机任务队

‘不打印空白页
‘撤消目前的打印任务
EndIf
EndWith
精选文档
精选文档
12
精选文档
..
精选文档
精选文档
13
精选文档
.
EndSub
⑷参数化画图程序
用VB开发应用程序时,假如使用参数化画图例程进行屏幕显示程序的开发,则在开发打印程序时,就不需再另行开发代码,从而防范了大批的重复劳动,有效地缩短了程序的开发周期。参数化画图例程就是:在开发例程时,为每一个例行程序供给一个OBJECT种类的参数,调用程序经过向例程的OBJECT种类参数分
别传达窗体、Printer对象,即可分别达成屏幕显示与打印机输出。见以下示
例:
SubPrintAnywhere(DestAsObject)
“HELLO!”
DestIsPrinterThen

EndIf
EndSub
要达成屏幕上的输出,调用PrintAnywhereMyform即可,而调用PrintAnywherePrinter则达成在打印机上输出。
⑸属性般配与窗体缩放
因为控制打印机实质画图地区大小的属性Height和Width,由目前正在使用的纸张决定,并且可打印的地区与纸张边沿有必定距离。因此为了获取正确的打印输出结果,不可以简单地将Printer对象直接传达给画图例行程序,还一定要解决打印机的缩放属性与显示窗体属性相般配的问题。即:保证使窗体中的打印内容以正确的大小显示,并居于可打印地区的中间。实质上实现的是打印机的坐标系统向屏幕坐标系统的变换。详尽过程是:使用打印机的ScaleX和ScaleY方法,获取以twip为单位的打印机尺寸,再利用窗体的ScaleX和ScaleY方法将这些尺寸变换为窗体中的坐标系统,从而实现以窗体的坐标系统供给打印机可打印区
域大小的目的。而后,用这些尺寸作为打印机中新的ScaleWidth和ScaleHeight,即可实现属性般配。
可是,我们在打印时,常常会碰到这样的场合——在不改变窗体形状的状况下,需要扩大或减小窗体的大小。要达成这样的工作,不但需要达成属性般配,还要确立对象被缩放的系数。程序以下:
PrivateSubSetPrinterScale(objAsObject)
精选文档
精选文档
14
精选文档
DimpwidAsSingle,phgtAsSingle,xmidAsSingle,ymidAsSingleDimowidAsSingle,ohgtAsSingle
owid=(,,vbTwips)
ohgt=(,,vbTwips)
‘获取窗体以Twips表示的尺寸
pwid=(,,vbTwips)
精选文档
精选文档
15
精选文档
..
精选文档
精选文档
13
精选文档
.
phgt=(,,vbTwips)
‘获取打印机以Twips表示的尺寸
If(ohgt/owid>phgt/pwid)Then
s=phgt/ohgt
Else
s=pwid/owid
EndIf‘计算缩放因子
pwid=(pwid,vbTwips,)/s
phgt=(phgt,vbTwips,)/s
‘将打印机的尺寸变换成obj的坐标系统/缩放因子
x_mid=+
y_mid=+‘设置打印地区的中心点坐

(x_mid-pwid/2,y_mid-phgt/2)-(x_mid+pwid/2,y_mid+phgt/2)
‘设置打印机中新的ScaleWidth和ScaleHeight
EndSub
⑹坐标定位
窗体、图片框控件以及Printer对象供给的TextWidth和TextHeight方法在
文本定位的应用方面很实用。TextWidth、TextHeight分别以对象目前的刻度单位返回字符串的宽度和高度。可是一定注意好多字体中其字符宽度其实不所有相同,因此不可以简单地将单个字符的宽度乘以字符数来获取字符串的宽度。对那些没有TextWidth和TextHeight的控件可经过设置父窗体的Font属性,使其与该控件的属性相般配,再利用父窗体的TextWidth和TextHeight获取它的字符串的宽度和高度。
可是,我们在达成屏幕显示程序调试后,在进行打印输出时却出现了屏幕显示与打印结果的不一致性的现象,表此刻所打印的字体之间坐标关系与屏幕显示不一样样,比方:屏幕显示上的两个字符不重叠,而打印出的字符却出现互相重叠的现象。经调试发现,问题出此刻字体尺寸的确定上。程序中,屏幕上显示的字符坐标是经过对象的TextWidth和TextHeight方法计算得来的,它直接遇到字体尺寸大小的影响。VB向用户供给的字体是在用户需要的打印机点的范围内,假如你需要的字体大小为73点,。可是窗体、
图片框控件的Fontsize只好是整数,,实质
上这就造成了屏幕上显示字体与实质打印字体大小之间产生了偏差。我们采纳
以下方法来解决该问题,就是在计算字体大小时,依据计算出来的字体尺寸,确立它存在的范围,而后再将它定位到VB供给的几种固定大小的字体上,而不是任意指定。自然,也能够有其他的解决方法。比方:字体大小采纳偶数等。因为
篇幅所限,这里不再作介绍。
精选文档
精选文档
17
精选文档
..
精选文档
精选文档
13
精选文档