1

我有一个用 C++ 编写的具有打印功能的 COM 组件。此打印功能将打印机 hDC 作为参数,其中包括用于打印的所有设置。以前,这是从 VB6 代码调用的,并且Printer.hdc在设置对象上的所有内容后将在这里工作Printer

代码从 VB6 转换为 VB.NET,我已经弄清楚了我需要做的大部分事情。旧的 Printer 对象可通过Microsoft.VisualBasic.PowerPacks.Printing.Compability.VB6.Printer该类获得,但hdc这里不支持旧的属性。

谁能告诉我如何获得这个hdc?这个 hdc 与对象GetHdevmode()上的相同吗?System.Drawing.Printing.PrinterSettings

4

3 回答 3

3

您可以从 PrinterSettings.CreateMeasurementGraphics() 返回的 Graphics 对象中获取一个。使用 Graphics.GetHdc() 方法。打印后不要忘记 ReleaseHdc()。

于 2010-01-12T17:07:23.297 回答
1

hdc 与 getdevmode 不同,但您可以在 .net 中执行所有操作而无需使用 hdc。如果使用旧代码可以节省时间,您可以从图形对象中获取 hdc 并将其用作 nobugz 的答案。但是,如果您有打印机的图形对象,直接绘制到图形对象并完全跳过 hdc 可能会更简单。

于 2010-01-13T06:37:45.907 回答
0

这是与Hans 建议的方法类似的方法,但它使用表单控件。如果您仍然使用表单控件,这可能是一种更简洁的方法。

PrintDocumentWindows 窗体工具箱中的一个放置到您的窗体中。

然后添加以下代码来处理打印页面(作为示例):

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 )

于 2017-12-04T21:58:02.577 回答