我必须从我的程序中打印一些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
调用打印功能时,我得到了一个打印机的附加对话框,我可以看到哪个打印机是默认的,但是该打印机未被选中。
实际上,我对combobox默认打印机更改的更改,但SELECTED PRINTER根本没有更改(从第一次使用时仍然记得),程序想要通过选定的打印机打印,而不是默认打印机。这种行为可能是好的,但问题是我无法用程序设置该选择。我可以使用代码更改默认打印机,但只能通过退出程序并返回来选择打印机。
如何选择带有组合框cboInstalledprinters
的打印机,以便程序自动使用选定的打印机?