0

我必须从我的程序中打印一些 html 文档。因此,我不能使用 .NET 提供的接口(如PrintDocument),但我做了一种解决方法。
为此,我WebBrowser在打印之前使用控制显示文档的单独表单,几乎没有用于确定打印参数的基本控件,例如选择打印机来打印该文档。

部分代码:
将打印机填充到组合框:

For Each pkInstalledPrinter As String In System.Drawing.Printing.PrinterSettings.InstalledPrinters
     cboInstalledprinters.Items.Add(pkInstalledPrinter)
Next pkInstalledPrinter

''p_printer is determined by program but should be changable
''if p_printer is empty then it should be system''s default printer

If p_printer = "" Then
    p_printer = getDefaultPrinter()
End If
cboInstalledprinters.SelectedItem = p_printer

要更改所需的打印机,用户可以使用cboInstalledprinters这样的组合框:

Private Sub cboInstalledprinters_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboInstalledprinters.SelectedIndexChanged
    p_printer = cboInstalledprinters.SelectedItem.ToString
    SetDefaultPrinter(p_printer)
End Sub

webBrowser 内容的打印是这样的:

 Dim MyWeb As Object = WebBrowser1.ActiveXInstance
 Try
     MyWeb.ExecWB(olecmdid.OLECMDID_PRINT, PromptUser, IntPtr.Zero, IntPtr.Zero)
 Catch ex As Exception
     MsgBox(ex.Message)
 End Try
 MyWeb = Nothing

PromptUserexecopt类型,可以在调用打印时从函数外部确定。

使用的功能:
getDefaultPrinter

Public Function getDefaultPrinter() As String
Dim oldPrinter As String
    Dim oPS As New System.Drawing.Printing.PrinterSettings
    Try
        oldPrinter = oPS.PrinterName
    Catch ex As System.Exception
        oldPrinter = ""
    End Try
    Return oldPrinter
End Function

setDefaultPrinter

<DllImport("winspool.drv", EntryPoint:="SetDefaultPrinter", _
 SetLastError:=True, CharSet:=CharSet.Auto, ExactSpelling:=False, CallingConvention:=CallingConvention.StdCall)> _
 Public Function setDefaultPrinter(ByVal strPrinterName As String) As Boolean
End Function

所有这些都很好。
但是有什么问题吗?

当我从组合框中切换(选择)不同的打印机时,我可以看到控制面板/设备和打印机中的默认打印机如何变化,这意味着默认打印机切换良好(绿色复选标记根据从组合框中的选择移动)。

我认为该程序会自动使用默认打印机进行打印,但是当我按下打印按钮调用打印时,我的程序不会打印到默认打印机。而不是使用 SELECTED 一个。当我调用打印功能时,execopt.OLECMDEXECOPT_PROMPTUSER我会得到与打印机的附加对话框,在其中我可以看到哪个打印机是默认的,但该打印机没有被选中。

实际上,随着我对组合框默认打印机更改的更改,但 SELECTED PRINTER 根本没有更改(从第一次使用时仍然记得)并且程序想要通过选定的打印机而不是默认打印机进行打印。这种行为可能很好,但问题是我无法使用程序设置该选择。我可以使用代码更改默认打印机,但只能通过退出程序并返回来选择打印机。

如何选择带有组合框的打印机,cboInstalledprinters以便程序自动使用选定的打印机?

4

0 回答 0