如何从 Visual Basic 引发和控制打印对话框

如何从 Visual Basic 引发和控制打印对话框

文章编号 : 322710
最后修改 : 2005年8月12日
修订 : 2.2

概要

您可以使用 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.dll100.0 KB
Vbprndlg.exp1.0 KB
Vbprndlg.lib1.72 KB
Vbprndlg.dep118 字节
Readme.txt10.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 对象将确保它在最小最大之间,而且在 FromPageToPage 属性中返回。这些属性并不直接映射到打印机对象上,因此引发此对话框和控制打印的程序必须处理这些属性。

对话框控件方法和属性

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

这篇文章中的信息适用于:
Microsoft Visual Basic 5.0 企业版
Microsoft Visual Basic 6.0 企业版
Microsoft Visual Basic 5.0 专业版
Microsoft Visual Basic 6.0 专业版
关键字: 
kbdownload kbcmndlgprint kbfile kbhowto kbhowtomaster kbsample KB322710
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、
posted @ 2006-03-26 01:30  观我生,君子无咎  阅读(1660)  评论(0)    收藏  举报