Skip to content

Printer 类

Printer对象封装一个Windows打印机设备,暴露一个绘图表面,记录应用程序的图形调用并将其作为打印作业转发到后台打印处理器。隐式Printer是可变的,跟踪系统默认打印机;Printers集合的条目是已安装设备的只读描述符,用于枚举或使用Set Printer = Printers("HP LaserJet")切换活动打印机。

打印作业在应用程序首次在Printer上调用绘图或文本方法(PrintLineCirclePSetPaintPicture等)时隐式开始,由EndDoc完成。NewPage在同一作业中前进到新页面;KillDoc在不完成当前页的情况下中止作业。

vb
Printer.FontSize = 12
Printer.Print "Hello, world!"
Printer.NewPage
Printer.Print "Second page."
Printer.EndDoc

用户代码从不直接实例化Printer——该类标记为[COMCreatable(False)],其公共API没有有用的构造函数。两条访问路径是隐式Printer全局对象和Printers集合。

默认Printer和Printers集合

twinBASIC暴露一个隐式Printer对象,可从用户代码的任何位置按名称访问,以及一个Printers集合,枚举系统上安装的每台打印机:

vb
Dim p As Printer
For Each p In Printers
    Debug.Print p.DeviceName, p.DriverName, p.Port
Next

默认情况下,隐式PrinterTrackDefaultTrue:每次属性读取都会查询当前系统默认打印机,因此应用程序无需重启即可反映用户在"设置→打印机"中所做的更改。写入设置属性、调用Set Printer = Printers(i)或开始打印作业会将TrackDefault锁定为False并将对象固定到特定设备。

Printers返回的条目是不可变的——对其属性赋值会引发运行时错误383(Property is read-only),文档控制方法会引发错误438(Object doesn't support this property or method)。要打印到其中一台,使用Set将其复制到隐式Printer上:

vb
Set Printer = Printers("HP LaserJet")
Printer.Orientation = vbPRORLandscape
Printer.Print "Hello on landscape paper."
Printer.EndDoc

Set Printer = …不会替换隐式实例——它将新设备的标识转发到现有对象上,在此过程中结束任何活动打印作业并丢弃缓存的设备上下文。

打印作业生命周期

管理作业的方法——EndDocKillDocNewPage——以及隐式的"首次输出时启动"规则共同形成一个小型状态机:

状态推进方式
无进行中的作业下一个绘图或文本方法开始新作业和新页面。
页面进行中NewPage发出当前页面并开始另一页;EndDoc发出当前页面并完成作业。
任何状态KillDoc在不发出当前页面内容的情况下中止作业。

Page报告当前页码(从1开始)。影响页面几何的属性赋值——PaperSizeOrientationCopiesWidthHeightDuplexPaperBinColorModePrintQualityZoom——必须在空白页面上赋值;在页面进行中赋值会引发错误396('PropertyName' cannot be set within a page)。

坐标系统

Printer有自己的坐标系统,通过ScaleModeScale*属性和Scale配置。默认模式为vbTwips,表面覆盖物理纸张区域。绘图原语使用当前单位消耗坐标;ScaleXScaleY在任意两种缩放模式之间转换距离而不改变活动模式。

vb
Printer.ScaleMode = vbInches
Printer.Line (0.5, 0.5)-(8, 10.5), vbBlack, B   ' 1/2英寸边距矩形

打印到文件

在作业开始之前将路径赋值给OutputFile会将原始后台输出重定向到该文件而非打印机设备。文件包含打印机驱动程序特定的字节,否则这些字节将通过端口发送——通常是.prn文件,稍后可使用COPY /B命令复制到端口。

vb
Printer.OutputFile = "C:\Spool\report.prn"
Printer.Print "Captured to file"
Printer.EndDoc

属性

ColorMode

打印机是否应以彩色或单色打印。

语法:object.ColorMode [ = value ]

value
PrinterObjectConstants_ColorMode的成员:vbPRCMMonochrome (1)或vbPRCMColor (2)。其他值引发错误380。

Copies

要打印的份数。Integer。驱动程序支持的最大值通过设备能力API检查:大于最大值的值引发错误380,不公布最大值的驱动程序引发错误483(Printer driver does not support specified property)。

CurrentX

PrintLineCirclePSet省略起始坐标时使用的水平画笔位置。Double,采用当前ScaleMode单位。每次绘图调用后自动更新。

CurrentY

垂直画笔位置。Double。参见CurrentX

DeviceName

绑定打印机的友好名称,如Windows打印机对话框中所示。String,只读。当TrackDefaultTrue时,返回当前默认打印机而非缓存值。

DrawMode

绘图方法输出与页面组合时应用的光栅操作。DrawModeConstants的成员,默认vbCopyPen(不透明覆盖)。打印机更改后自动重新应用。

DrawStyle

线条绘制方法使用的画笔图案。DrawStyleConstants的成员:vbSolid (0,默认)、vbDashvbDotvbDashDotvbDashDotDotvbInvisiblevbInsideSolid。当DrawWidth大于1时强制为实线。

DrawWidth

LineCirclePSet使用的画笔粗细,以像素为单位。Long,默认1。

DriverName

处理绑定打印机的设备驱动程序名称。String,只读。当TrackDefaultTrue时,返回当前默认打印机的驱动程序。

Duplex

打印机是否应在纸张的一面或两面打印。

语法:object.Duplex [ = value ]

value
PrinterObjectConstants_Duplex的成员:vbPRDPSimplex (1)、vbPRDPHorizontal (2)或vbPRDPVertical (3)。超过驱动程序报告的双面打印能力的值引发错误380。简单单面始终被接受,即使驱动程序不公布双面打印支持。

FillColor

用于填充Line(带F标志时)和Circle绘制的闭合形状的颜色,类型为OLE_COLOR。默认0(黑色)。仅在FillStyle不为vbFSTransparent时有效。

FillStyle

用于填充闭合形状的图案。FillStyleConstants的成员:vbFSTransparent (1,默认)、vbFSSolid (0)或某种影线样式。Transparent完全抑制填充,因此只绘制轮廓。

Font

用于渲染Print输出和由TextWidth / TextHeight测量的StdFont。便捷属性FontNameFontSizeFontBoldFontItalicFontStrikethruFontUnderlineFontTransparent读写此对象的成员。将字符串赋值给Font是赋值给Font.Name的快捷方式;使用Set赋值StdFont替换底层字体对象。

在从Printers获取的打印机上,Font仍可读取(返回一个新的可变StdFont),但重新赋值会引发错误383。

FontBold

Font.Bold的快捷方式。Boolean

FontCount

打印机上安装的字型数量。Long,只读。与Fonts一起使用进行枚举。

FontItalic

Font.Italic的快捷方式。Boolean

FontName

Font.Name的快捷方式。String

Fonts

对打印机上安装的字型名称的索引访问。

语法:object.Fonts( Index ) As String

Index
必需 从零开始的Long,范围0 .. FontCount - 1。超出范围的索引返回空字符串而非引发错误。

FontSize

Font.Size的快捷方式,磅值。Single

FontStrikethru

Font.Strikethrough的快捷方式。Boolean

FontTransparent

当为True(默认)时,Print绘制的文本在字形之间保留背景像素不变;当为False时,字形的背景以打印机的绘制背景色填充。Boolean

FontUnderline

Font.Underline的快捷方式。Boolean

ForeColor

绘图方法画笔(线条、圆形、点)和Print文本使用的颜色。OLE_COLOR

hDC

打印机绘图表面的Win32设备上下文句柄,类型为LongPtr。只读。

首次读取hDC会创建设备上下文——调用驱动程序的CreateDC并准备绘图表面——但不会启动后台打印作业。后台打印处理器仅在第一个绘图调用运行时启动,因此读取hDC进行例如GetDeviceCaps查询是非承诺性的:如果应用程序之后从不调用绘图方法,则不会打印任何内容。

Height

物理页面高度,以缇为单位。Long。赋值会覆盖驱动程序报告的纸张高度并强制PaperSize为自定义大小;新值可通过Height本身读回。

Orientation

页面方向。

语法:object.Orientation [ = value ]

value
PrinterObjectConstants_Orientation的成员:vbPRORPortrait (1)或vbPRORLandscape (2)。在不公布DC_ORIENTATION能力的驱动程序上赋值横向会引发错误380;纵向始终被接受。

OutputFile

用于捕获原始后台字节而非发送到打印机设备的文件路径。String。twinBASIC新增。必须在第一次绘图调用之前设置;在作业活动时赋值对运行中的作业没有影响。在从Printers获取的打印机上只读。

Page

当前正在编写的页码,作业开始时从1起。Long,只读。由EndDocKillDoc重置为1;由NewPage递增。

PaperBin

打印机应从哪个纸盒取纸。

语法:object.PaperBin [ = value ]

value
PrinterObjectConstants_PaperBin的成员——例如vbPRBNUppervbPRBNManualvbPRBNCassette。该值必须是驱动程序通过DC_BINS枚举的纸盒之一;不支持的值引发错误380。

PaperSize

要打印的纸张大小。

语法:object.PaperSize [ = value ]

value
PrinterObjectConstants_PaperSize的成员——例如vbPRPSLettervbPRPSA4vbPRPSEnv10。对WidthHeight赋值会将此属性强制为vbPRPSUser (256)。

Port

连接到打印机的端口名称(如LPT1:USB001IP_192.168.1.50)。String,只读。当TrackDefaultTrue时,返回当前默认打印机的端口。

PrintQuality

打印分辨率。

语法:object.PrintQuality [ = value ]

value
Integer——驱动程序支持的正DPI值,或PrinterObjectConstants_PrintQuality的成员:vbPRPQDraft (-1)、vbPRPQLow (-2)、vbPRPQMedium (-3)或vbPRPQHigh (-4)。零或低于-4的值引发错误380。

RightToLeft

INFO

保留用于与VB6兼容;目前在twinBASIC中未实现。

ScaleHeight

ScaleMode单位表示的打印机绘图表面垂直范围。Double。赋值会将ScaleMode切换为vbUser并重新缩放垂直轴,使页面映射到新高度。

ScaleLeft

映射到可打印区域左边缘的X坐标。Double,默认0。赋值会将ScaleMode切换为vbUser

ScaleMode

CurrentXCurrentY和每个绘图方法使用的单位。ScaleModeConstants的成员:vbUser (0)、vbTwips (1,默认)、vbPointsvbPixelsvbCharactersvbInchesvbMillimetersvbCentimeters。从vbUser切换开时将ScaleLeftScaleTop重置为0。

ScaleTop

映射到可打印区域上边缘的Y坐标。Double,默认0。赋值会将ScaleMode切换为vbUser

ScaleWidth

ScaleMode单位表示的打印机绘图表面水平范围。Double。赋值会将ScaleMode切换为vbUser

TrackDefault

当为True时,每次属性读取查询当前系统默认打印机;当为False时,Printer锁定到由DeviceNameDriverNamePort标识的特定设备。Boolean

TrackDefault设置为False会将当前默认设备捕获到缓存标识符中,使后续读取停止漂移。将其设回True会结束任何活动打印作业(如同调用了EndDoc)并清除缓存的设备上下文。在从Printers获取的打印机上始终为False,且只读。

TwipsPerPixelX

水平方向上一个设备像素对应的缇数——用于自定义DPI感知的尺寸调整。Double,只读。

TwipsPerPixelY

TwipsPerPixelX的垂直对应属性。Double,只读。

Width

物理页面宽度,以缇为单位。Long。赋值会覆盖驱动程序报告的纸张宽度并强制PaperSize为自定义大小;新值可通过Width本身读回。

Zoom

驱动程序应用的打印缩放百分比。Integer,默认100。大于100的值放大输出;小于100的值缩小输出。零和负值引发错误380。

方法

Circle

在当前页面上绘制圆形、椭圆形或椭圆弧。

语法:object.Circle [ Step ] ( X, Y ), Radius [, Color [, Start [, End [, Aspect ] ] ] ]

X, Y
必需 中心坐标,采用ScaleMode单位。SingleStep使它们相对于CurrentX / CurrentY
Radius
必需 沿X轴的半径。Single
Color
可选 轮廓的OLE_COLOR。默认为ForeColor
StartEnd
可选 起始和结束角度,以弧度为单位(0到2π)。负值将弧端点连接到中心形成弦。省略则绘制完整圆形。
Aspect
可选 Y/X纵横比。1.0为圆形(默认);其他值为椭圆形。

如果没有进行中的作业,Circle隐式启动一个。

EndDoc

完成当前打印作业,将当前页面上的内容发送到后台打印处理器并释放底层GDI文档。没有进行中的作业时无效果。

语法:object.EndDoc

KillDoc

中止当前打印作业,丢弃任何进行中的页面输出。立即释放设备上下文,除AbortDoc调用外不再与后台打印处理器交互。

语法:object.KillDoc

Line

绘制直线、矩形轮廓或填充矩形。

语法:object.Line [ [ Step ] ( X1, Y1 ) ] - [ Step ] ( X2, Y2 ) [, Color [, B [F] ] ]

X1, Y1
可选 起始坐标。Single。如果省略,线条从CurrentX / CurrentY开始。Step使它们相对于画笔。
X2, Y2
必需 结束坐标。SingleStep使它们相对于起始点。
Color
可选 线条的OLE_COLOR。默认为ForeColor
B
可选 绘制以*(X1, Y1)(X2, Y2)*为对角的矩形而非线条。
F
可选 仅在带B时有效。以FillColor和当前FillStyle填充矩形。

如果没有进行中的作业,Line隐式启动一个。

NewPage

将当前页面发送到后台打印处理器并开始新的空白页面。Page递增;CurrentXCurrentY重置为0。如果没有进行中的作业,NewPage在发出第一个分页符之前隐式启动一个。

语法:object.NewPage

PaintPicture

将图片绘制到当前页面上,可选缩放、裁剪或应用光栅操作。

语法:object.PaintPicture Picture, X1, Y1 [, Width1 [, Height1 [, X2 [, Y2 [, Width2 [, Height2 [, Opcode ] ] ] ] ] ] ]

Picture
必需 要绘制的IPictureDisp
X1, Y1
必需 目标左上角,采用ScaleMode单位。
Width1, Height1
可选 目标大小。默认为图片的自然大小。
X2, Y2, Width2, Height2
可选 Picture内的源矩形。默认为整个图片。
Opcode
可选 传递给BitBlt的光栅操作代码——例如**&HCC0020**(vbSrcCopy,默认)或**&H660046**(vbSrcInvert)。

如果没有进行中的作业,PaintPicture隐式启动一个。

Print

使用Font将文本写入当前页面,从CurrentX / CurrentY开始并随着写入推进。通过Print语句分派,因此多个表达式可以用;(无间距)或,(跳到下一个打印区域)分隔。**Spc(n)**插入n个空格,**Tab(n)**移动到打印列n

语法:object.Print [ expressionlist ] [ ; | , ]

末尾的;,抑制换行,使下一个Print调用继续在同一行。如果没有进行中的作业,Print隐式启动一个。

PSet

在当前页面上设置单个像素。

语法:object.PSet [ Step ] ( X, Y ) [, Color ]

X, Y
必需 坐标,采用ScaleMode单位。SingleStep使它们相对于CurrentX / CurrentY
Color
可选 OLE_COLOR。默认为ForeColor

如果没有进行中的作业,PSet隐式启动一个。

Scale

为页面定义用户坐标系。不带参数调用ScaleScaleMode重置为vbTwips并清除ScaleLeft / ScaleTop

语法:object.Scale [ ( X1, Y1 ) - ( X2, Y2 ) ]

X1, Y1
必需(与第二对一起)映射到左上角的坐标——设置ScaleLeftScaleTop
X2, Y2
必需 映射到右下角的坐标——设置ScaleWidth = X2 - X1ScaleHeight = Y2 - Y1ScaleMode变为vbUser

带坐标调用Scale隐式启动打印作业(匹配VB6行为);不带参数调用不会。

ScaleX

将水平距离从一种缩放模式转换为另一种,不改变打印机的ScaleMode

语法:object.ScaleX( Width, FromScale [, ToScale ] ) As Double

Width
必需 要转换的值。Double
FromScale
必需 ScaleModeConstants成员,标识Width的单位。与PictureBoxForm不同,此参数在Printer上没有默认值——省略会引发错误448(Named argument not found)。
ToScale
可选 ScaleModeConstants成员,标识结果的单位;默认为打印机当前的ScaleMode

ScaleY

ScaleX的垂直对应方法,用于高度。

语法:object.ScaleY( Height, FromScale [, ToScale ] ) As Double

TextHeight

以当前Font渲染给定字符串时的高度,采用ScaleMode单位——包括行间距前端留白,因此结果适合用于在文本行之间推进CurrentY。嵌入的换行符被遵循。

语法:object.TextHeight( Str As String ) As Double

TextWidth

以当前Font渲染给定字符串时的宽度,采用ScaleMode单位。当Str包含嵌入的换行符时返回最长行的宽度。

语法:object.TextWidth( Str As String ) As Double

另请参见

twinBASIC及其LOGO版权为作者"韦恩"所有