您可以使用 Vbprndlg.dll 文件代替 Visual Basic
CommonDialog 控件的
打印对话框部分。此文件公开了一些属性并提供了
CommonDialog 控件所没有的功能。
Visual Basic 中的
CommonDialog 控件允许显示
打印对话框,但它未不允许访问可在
打印对话框中进行设置并由
打印机对象使用的许多属性。由于结构(用户定义的结构类型)的对齐问题,当从 Visual Basic 调用 Win32 应用程序编程接口 (API) 函数时,使用这些 API 调用无法可靠地获得其他信息。作为一种替代方法,本文提供了一个 DLL,可用来代替
CommonDialog 控件的
打印机部分。
下载控件
从 Microsoft 下载中心可以下载以下文件:
Vbprndlg.exe (http://download.microsoft.com/download//vb60pro/utility/1.0/win98mexp/en-us/vbprndlg.exe) 发布日期:2002 年 9 月 30 日
有关如何下载 Microsoft 支持文件的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591 (http://support.microsoft.com/kb/119591/) 如何从联机服务获取 Microsoft 支持文件
Microsoft 已对此文件进行了病毒扫描。Microsoft 使用的是该文件发布时可以获得的最新病毒检测软件。该文件存储在安全性得到增强的服务器上,以防止在未经授权的情况下对其进行更改。 Vbprndlg.exe 文件中包含下列文件:
| 文件名 | 大小 |
|---|
| Vbprndlg.dll | 100.0 KB |
| Vbprndlg.exp | 1.0 KB |
| Vbprndlg.lib | 1.72 KB |
| Vbprndlg.dep | 118 字节 |
| Readme.txt | 10.9 KB |
安装 Vbprndlg.exe
| 1. | 将这些文件提取到一个不会被删除而且路径简单的位置。此类文件一般放在 Windows 或 Winnt 目录下的 System32 目录中。 |
| 2. | 单击开始,然后单击运行。 |
| 3. | 键入以下命令,然后单击确定。
RegSvr32 C:\Windows\System32\VBPrnDlg.dll 确保将 DLL 的实际完整路径用作此命令的第二部分。
您会收到一条指出 DLL 成功注册的消息。 |
Printerdlg 类文档
此 DLL 是一个作为引用项添加到 Visual Basic 应用程序的 COM 组件。在添加此 DLL 后,您可以在代码中使用它以显示
打印对话框并检索用户选择的信息。此行为与 Visual Basic 的
CommonDialog 控件中的
打印对话框的行为相同。
对话框属性
要获得有关这些属性中任一属性的文档资料,请参见介绍
CommonDialog 控件的文档。
Printer.hdc 是只读文档,但是当您使用下面的语法时,下列所有属性(标有星号 (*) 的属性除外)都将直接映射到
打印机对象:
Printer.Copies = printDlg.Copies
| • | Copies |
| • | Orientation |
| • | ColorMode |
| • | DriverName |
| • | Duplex |
| • | PaperBin |
| • | PaperSize |
| • | Port |
| • | PrintQuality |
| • | hDC |
| • | PrinterName * |
| • | Min * |
| • | Max * |
| • | FromPage * |
| • | ToPage * |
PrinterName 映射为
打印机对象中的
DeviceName。最后四种用星号 (*) 标出的属性用来确定可用页的一个子集是否必须打印。要启用
打印对话框的
选择页面部分,必须将
最大设置为比
最小大的数值。如果
最小大于
最大,则显示对话框时会发生错误。如果用户选择了一个子集,则
PrinterDlg 对象将确保它在
最小和
最大之间,而且在
FromPage 和
ToPage 属性中返回。这些属性并不直接映射到
打印机对象上,因此引发此对话框和控制打印的程序必须处理这些属性。
对话框控件方法和属性
| • | Flags - 它与 CommonDialog 控件上的 Flags 属性相同。它控制该对话框的某些功能。该值是使用“Or”和 VBPrinterConstants 结构中的不同常量设置的。例如:printDlg.Flags = VBPrinterConstants.cdlPDDisablePrintToFile _
Or VBPrinterConstants.cdlPDNoPageNums
这些常量是:常量 值 描述
---------------------------------------------------------------------------
cdlPDAllPages &H0 返回或设置“所有页面”选项按钮的状态。
cdlPDCollate &H10 返回或设置“装订”复选框的状态。
cdlPDDisablePrintToFile &H80000 禁用“打印到文件”复选框。
cdlPDHelpButton &H800 使对话框显示“帮助”按钮。
cdlPDHidePrintToFile &H100000 隐藏“打印到文件”复选框。
cdlPDNoPageNums &H8 禁用“页面”选项按钮和相关的编辑控件。
cdlPDNoSelection &H4 禁用“选择”选项按钮。
cdlPDNoWarning &H80 阻止没有默认打印机时显示警告消息。
cdlPDPageNums &H2 返回或设置“页面”选项按钮的状态。
cdlPDPrintSetup &H40 使系统显示“打印设置”对话框而不是“打印”对话框。
cdlPDPrintToFile &H20 返回或设置“打印到文件”复选框的状态。
cdlPDReturnDC &H100 返回在对话框中选择的打印机的设备上下文。
在对话框的hDC 属性中返回设备上下文。
cdlPDReturnDefault &H400 返回默认打印机的名称。
cdlPDReturnIC &H200 返回在对话框中选择的打印机的信息上下文。
信息上下文提供了获取设备信息的快速
方法,而不用创建设备上下文。在对话
框的 hDC 属性中返回信息上下文。
cdlPDSelection &H1 返回或设置“选择”选项按钮的状态。如果没有指定
cdlPDPageNums 和 cdlPDSelection,则“全部”
选项按钮处于选中状态。
cdlPDUseDevModeCopies &H40000 如果打印机驱动程序不支持多份,则设置此标志
将禁用“打印”对话框中的“份数”微调器控件。
如果驱动程序不支持多份,则设置此标志将指示
对话框存储“Copies”属性中要求的份数。
您可以使用 Flags 属性来确定用户是否选择某个字段(如打印到文件)。为此,请查看在该控件从显示对话框这一操作返回后是否设置了 cdlPDPrintToFile 标志。
|
| • | CancelError - 这是一个布尔型标志,可以确定用户单击取消时是否有错误返回到该程序。默认情况下它为 False,因此如果用户单击取消不会出现错误。如果将它设置为 True,则用户单击取消时将出现错误代码 32755 (&H7FF3)。您可以捕获此错误以处理用户取消对话框的情形。 |
| • | ShowPrinter - 这是此类中唯一的一个方法。调用此方法将显示对话框。它接受调用窗口的句柄作为一个参数。例如,下面的方法将返回一个布尔值: printDlg.ShowPrinter Me.hWnd
可以忽略它。如果用户单击打印,则该值为 True,否则为 False(即,如果用户单击取消,则为 False)。 |
注意:在所有这些示例中,
printDlg 是该类的一个包含在此 DLL 中的实例。它使用下面的代码声明:
Dim printDlg As PrinterDlg
Set printDlg = New PrinterDlg
生成示例的步骤
若要创建一个示例应用程序,该程序将使用 DLL 来确定用户的首选项然后将它们写入“调试”窗口,请按照下列步骤操作:
| 1. | 在 Microsoft Visual Basic 中,创建一个新的标准 EXE 项目。默认情况下会创建 Form1。 |
| 2. | 在项目菜单上,单击引用。 |
| 3. | 选择“Microsoft VB 打印机对话框 (PSS)”,然后单击确定。 |
| 4. | 向窗体添加一个 CommandButton 控件。默认情况下,将创建 Command1。 |
| 5. | 双击 Command1。 |
| 6. | 将以下代码粘贴到 Command1_Click 事件中:Dim printDlg As PrinterDlg
Set printDlg = New PrinterDlg
' Set the starting information for the dialog box based on the current
' printer settings.
printDlg.PrinterName = Printer.DeviceName
printDlg.DriverName = Printer.DriverName
printDlg.Port = Printer.Port
' Set the default PaperBin so that a valid value is returned even
' in the Cancel case.
printDlg.PaperBin = Printer.PaperBin
' Set the flags for the PrinterDlg object using the same flags as in the
' common dialog control. The structure starts with VBPrinterConstants.
printDlg.Flags = VBPrinterConstants.cdlPDNoSelection _
Or VBPrinterConstants.cdlPDNoPageNums _
Or VBPrinterConstants.cdlPDReturnDC
Printer.TrackDefault = False
' When CancelError is set to True the ShowPrinterDlg will return error
' 32755. You can handle the error to know when the Cancel button was
' clicked. Enable this by uncommenting the lines prefixed with "'**".
'**printDlg.CancelError = True
' Add error handling for Cancel.
'**On Error GoTo Cancel
If Not printDlg.ShowPrinter(Me.hWnd) Then
Debug.Print "Cancel Selected"
Exit Sub
End If
'Turn off Error Handling for Cancel.
'**On Error GoTo 0
Dim NewPrinterName As String
Dim objPrinter As Printer
Dim strsetting As String
' Locate the printer that the user selected in the Printers collection.
NewPrinterName = UCase$(printDlg.PrinterName)
If Printer.DeviceName <> NewPrinterName Then
For Each objPrinter In Printers
If UCase$(objPrinter.DeviceName) = NewPrinterName Then
Set Printer = objPrinter
End If
Next
End If
' Copy user input from the dialog box to the properties of the selected printer.
Printer.Copies = printDlg.Copies
Printer.Orientation = printDlg.Orientation
Printer.ColorMode = printDlg.ColorMode
Printer.Duplex = printDlg.Duplex
Printer.PaperBin = printDlg.PaperBin
Printer.PaperSize = printDlg.PaperSize
Printer.PrintQuality = printDlg.PrintQuality
' Display the results in the immediate (Debug) window.
' NOTE: Supported values for PaperBin and Size are printer specific. Some
' common defaults are defined in the Win32 SDK in MSDN and in Visual Basic.
' Print quality is the number of dots per inch.
With Printer
Debug.Print .DeviceName
If .Orientation = 1 Then
strsetting = "Portrait. "
Else
strsetting = "Landscape. "
End If
Debug.Print "Copies = " & .Copies, "Orientation = " & _
strsetting
If .ColorMode = 1 Then
strsetting = "Black and White. "
Else
strsetting = "Color. "
End If
Debug.Print "ColorMode = " & strsetting
If .Duplex = 1 Then
strsetting = "None. "
ElseIf .Duplex = 2 Then
strsetting = "Horizontal/Long Edge. "
ElseIf .Duplex = 3 Then
strsetting = "Vertical/Short Edge. "
Else
strsetting = "Unknown. "
End If
Debug.Print "Duplex = " & strsetting
Debug.Print "PaperBin = " & .PaperBin
Debug.Print "PaperSize = " & .PaperSize
Debug.Print "PrintQuality = " & .PrintQuality
If (printDlg.Flags And VBPrinterConstants.cdlPDPrintToFile) = _
VBPrinterConstants.cdlPDPrintToFile Then
Debug.Print "Print to File Selected"
Else
Debug.Print "Print to File Not Selected"
End If
Debug.Print "hDC = " & printDlg.hDC
End With
Exit Sub
'**Cancel:
'**If Err.Number = 32755 Then
'** Debug.Print "Cancel Selected"
'**Else
'** Debug.Print "A nonCancel Error Occured - "; Err.Number
'**End If
|
| 7. | 按 F5 键以开始调试并启动该应用程序。单击 Command1 以打开打印对话框。 |
| 8. | 在您从打印 对话框返回后,在“调试”窗口中查看返回的输出内容。 |
注意:如果您想在用户单击
取消时引发并处理某一特定的错误(与发生在
CommonDialog 控件中的行为类似),请取消注释以“**”开头的那些行。
有关使用 Visual Basic 中的“打印”对话框的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
173981 (http://support.microsoft.com/kb/173981/) PRB:不同平台上“打印”对话框的行为差异
有关打印机设置的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
190218 (http://support.microsoft.com/kb/190218/) 如何检索打印机驱动程序的设置
194789 (http://support.microsoft.com/kb/194789/) 如何使用 DeviceCapabilities API 确定可用 PaperBins