1 year ago

#167273

test-img

VeryColdAir

Is there a way to use the graphics class methods (Graphics.DrawString or Graphics.DrawLine) for a PrintDocumet outside of the PrintPage event?

I'm rewriting a VB6 application in VB.net. Instead of using the VB6 printer namespace, I'm trying make the code natively VB.net compatible.

The VB6 application has a bunch of printer.print statements as well as a bunch of printer.line statements. (I believe the lines use TWIPs.) Here is an example of some of the lines.

Printer.DrawWidth = 1.5
Printer.Line (200, 12940)-(11275, 12940)
Printer.Line (200, 13680)-(6660, 13680)
Printer.Line (6712, 13680)-(11275, 13680)
Printer.FillStyle = vbFSTransparent
Printer.DrawWidth = 1
Printer.DrawStyle = vbDashDot
Printer.Circle (5700, 6000), draw_scale * BC_Diam / 2
media.FontItalic = True
Printer.Print "some text"
media.FontItalic = False
Printer.Print "additional, non italic text"

The only way I've been able to find how to do any of this in VB.net is by using the PrintDocument's PrintPage event. A problem with doing it this way is you have to pass all of the text to this subroutine all at once and deal with a "printArea" for word wrap. Another problem is it makes it very difficult to switch between italic and non italic text. In the same way for text, I think I would have to pass in all of the line/circle coordinates as well, then draw them from the event subroutine.

Private Sub document_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles document.PrintPage
    Dim printFont As Font = New Font("Courier New", 8.5, FontStyle.Regular)

    ' Set print area size and margins
    With document.DefaultPageSettings
        Dim leftMargin As Integer = .Margins.Left 'X
        Dim topMargin As Integer = .Margins.Top   'Y
        Dim printHeight As Integer = .PaperSize.Height - topMargin * 2
        Dim printWidth As Integer = .PaperSize.Width - leftMargin * 2
    End With

    ' Check if the user selected to print in Landscape mode
    ' if they did then we need to swap height/width parameters
    If document.DefaultPageSettings.Landscape Then
        Dim tmp As Integer
        tmp = printHeight
        printHeight = printWidth
        printWidth = tmp
    End If

    Dim lines As Int32
    Dim chars As Int32

    'Now we need to determine the total number of lines
    'we're going to be printing
    Dim numLines As Int32 = CInt(printHeight / printFont.Height)

    ' Create a rectangle printing are for our document
    Dim printArea As New RectangleF(leftMargin, topMargin, printWidth, printHeight)

    ' Set format of string.
    Dim format As New StringFormat(StringFormatFlags.LineLimit)

    e.Graphics.MeasureString(txtText.Text.Substring(curChar), printFont, New SizeF(printWidth, printHeight), format, chars, lines)

    e.Graphics.DrawString(txtText.Text.Substring(curChar), printFont, Brushes.Black, printArea, format)

    'Increase current char count
    curChar += chars

    'Detemine if there is more text to print, if
    'there is the tell the printer there is more coming

    Debug.Print("curChar < txtText.Text.Length:" & (curChar < txtText.Text.Length))
    If curChar < txtText.Text.Length Then
        e.HasMorePages = True
    Else
        e.HasMorePages = False
        curChar = 0
    End If
End Sub

There has to be a better way to do this, right? How I can call Graphics.DrawLine, Graphics.DrawEllipse, Graphics.DrawString, etc. for the PrintDocument from outside of the PrintPage event in VB.net like you could in VB6?

vb.net

printing

vb6

vb6-migration

0 Answers

Your Answer

Accepted video resources