我必须从我的程序中打印一些 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
PromptUser
是execopt
类型,可以在调用打印时从函数外部确定。
使用的功能:
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
以便程序自动使用选定的打印机?