我有一个用C ++编写的COM组件,它具有Print功能。此打印功能将Printer hDC作为参数包含用于打印的所有设置。以前,这是从VB6代码调用的,Printer.hdc
在设置Printer
对象上的所有内容之后可以在这里工作。
代码从VB6转换为VB.NET,我已经找到了我需要做的大部分事情。旧的Printer对象可通过Microsoft.VisualBasic.PowerPacks.Printing.Compability.VB6.Printer
类获得,但此处不支持旧的hdc
属性。
谁能告诉我如何获得这个hdc?
此hdc与GetHdevmode()
对象上的System.Drawing.Printing.PrinterSettings
相同吗?
答案 0 :(得分:2)
您可以从PrinterSettings.CreateMeasurementGraphics()返回的Graphics对象中获取一个。使用Graphics.GetHdc()方法。打印后不要忘记ReleaseHdc()。
答案 1 :(得分:1)
Hdc与getdevmode不同,但您可以在不使用hdc的情况下在.net中执行所有操作。如果使用旧代码节省时间,您可以从图形对象获取hdc并在nobugz的答案中使用它。但是如果你有一个打印机的图形对象,直接绘制到图形对象并完全跳过hdc可能更简单。
答案 2 :(得分:0)
这里采用与suggested by Hans类似的方法,但它使用表单控件。如果您正在使用表单控件,这可能是一种更简洁的方法。
将Windows窗格工具箱中的PrintDocument
放置到表单中。
然后添加以下代码来处理打印页面(作为示例):
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim printerhdc As IntPtr = e.Graphics.GetHdc()
' Do whatever you need to do to get the right image
XYZ.Load file(currentpagenumber)
XYZ.Render(printerhdc.ToInt64, 25, 25, Width, Height)
CurrentPageNumber += 1
If CurrentPageNumber < TotalPageCount Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
e.Graphics.ReleaseHdc(printerhdc)
End Sub
...
'Gather all the files you need and put their names in an arraylist.
'Then issue the print command
PrintDocument1.Print
' You've just printed your files
来源:http://www.vbforums.com/showthread.php?247493-Good-ol-Printer-hDC
(来源:http://www.vbforums.com/showthread.php?247493-Good-ol-Printer-hDC)