如何获得打印机HDC

时间:2010-01-12 16:55:23

标签: vb.net printing vb6-migration powerpacks

我有一个用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相同吗?

3 个答案:

答案 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