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

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

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

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


person awe    schedule 12.01.2010    source источник


Ответы (3)


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

person Hans Passant    schedule 12.01.2010
comment
Когда я создал новый объект PrinterSettings, он фактически был инициализирован значениями из объекта совместимости Printer, для которых я установил значения ранее. Таким образом, это фактически то же самое, что и вызов Printer.hdc! Большое спасибо! - person awe; 13.01.2010

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

person xpda    schedule 13.01.2010

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

Поместите 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

(источник: https://stackoverflow.com/a/2050785/3195477 )

person StayOnTarget    schedule 04.12.2017