Как я могу получить принтер HDC

У меня есть COM-компонент, написанный на C++, который имеет функцию Print. Эта функция печати принимает значение постоянного тока принтера в качестве параметра, который включает в себя все параметры, которые будут использоваться для печати. Ранее это вызывалось из кода VB6, и Printer.hdc будет работать здесь после установки всего на Printer объект.

Код был преобразован из VB6 в VB.NET, и я выяснил большинство вещей, которые мне нужно сделать. Старый объект "Принтер" доступен через Microsoft.VisualBasic.PowerPacks.Printing.Compability.VB6.Printer класс, но старый hdc свойство не поддерживается здесь.

Может кто-нибудь сказать мне, как получить этот HDC? Это HDC такой же, как GetHdevmode() на System.Drawing.Printing.PrinterSettings объект?

3 ответа

Решение

Вы можете получить его из объекта Graphics, возвращенного функцией PrinterSettings.CreateMeasurementGraphics(). Используйте метод Graphics.GetHdc(). Не забудьте ReleaseHdc() после печати.

Hdc - это не то же самое, что getdevmode, но вы можете делать все в.net без использования hdc. Если это экономит время, используя старый код, вы можете получить hdc из графического объекта и использовать его, как в ответе nobugz. Но если у вас есть графический объект для принтера, может быть проще нарисовать непосредственно графический объект и вообще пропустить HDC.

Вот аналогичный подход, предложенный Гансом, но он использует элемент управления формы. Если вы все равно используете элемент управления формой, это может быть более чистый подход.

Поместите PrintDocument из панели инструментов Windows Forms к вашей форме.

Затем добавьте следующий код для обработки страницы печати (в качестве примера):

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)

Другие вопросы по тегам