vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück
Rubrik: Drucker   |   VB-Versionen: VB.NET20.11.06
Text drucken (VB.NET 2005)

Klasse zum Drucken von beliebigem Text - entweder direkt auf dem Drucker oder zunächst in eine Seitenvorschau

Autor:   lightyBewertung:     [ Jetzt bewerten ]Views:  29.148 
ohne HomepageSystem:  WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

In einem früheren Tipp wurde bereits gezeigt, wie sich der Inhalt einer mehrzeiligen TextBox ausdrucken lässt:
 MultiLine TextBox drucken (VB.NET 2005)

Mit nachfolgendem Klassenmodul lässt sich das Ganze jetzt noch einfacher und komfortabler handhaben. Sie brauchen der PrintText-Klasse lediglich den zu druckenden Text als String übergeben und rufen dann einfach die gewünschte Ausgabe auf: Ausdruck auf Drucker oder alternativ in eine Seitenvorschau. Desweitern wurde die PrintText-Klasse um weitere Eigenschaften und Methoden erweitert.

Eigenschaften:

  • Font: Gibt die Schrift an oder ruft diese ab
  • ForeColor: Gibt die Schriftfarbe des Textes an oder ruft diese ab
  • Landscape: Gibt an ob die Seite im Hoch- oder Querformat gedruckt werden soll

Methoden:

  • Print: Gibt den Text direkt auf den Drucker aus
  • PrintPreviewDialog: Gibt eine Druckvorschau aus
  • PageSetupDialog: Zeigt das Fenster "Seite einrichten" an
  • PrintDialog: Zeigt das Fenster "Drucken" an

Das Klassenmodul PrintText.vb
Fügen Sie Ihrem Projekt ein neues Klassenmodul namens "PrintText" mit folgendem Code hinzu:

Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Windows.Forms
 
Namespace Printing
  Public Class PrintText
 
    Private FirstTime As Boolean
    Private _Text As String
    Dim wörter() As String = Nothing
    Private AktWort As Integer
    Private AktBuchstabe As Integer
 
    Private WithEvents PD As New PrintDocument
    Private PS As New PageSetupDialog
    Private PrintD As New PrintDialog
    Private Prev As New PrintPreviewDialog
 
    Dim lands As Boolean
 
    Dim FColor As Brush = Brushes.Black
    Dim _Font As Font = New Font("Microsoft Sans Serif", _
      10, FontStyle.Regular, GraphicsUnit.Pixel)
    Dim FSize As Single = 10
    Dim FStyle As FontStyle = Drawing.FontStyle.Regular
 
#Region "Properties"
 
    ''' <summary>
    ''' Gibt die Schriftfarbe des Textes an oder ruft diese ab 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ForeColor() As Brush
      Get
        Return FColor
      End Get
      Set(ByVal value As Brush)
        FColor = value
      End Set
    End Property
 
    ''' <summary>
    ''' Gibt die Schrift an oder ruft diese ab
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Font(ByVal Schrift As Font) As System.Drawing.Font
      Get
        Return _Font
      End Get
      Set(ByVal value As System.Drawing.Font)
        _Font = value
      End Set
    End Property
 
    ''' <summary>
    ''' Gibt an ob die Seite im Hoch- oder Querformat gedruckt werden soll
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Landscape() As Boolean
      Get
        Return lands
      End Get
      Set(ByVal value As Boolean)
        lands = value
        PD.DefaultPageSettings.Landscape = value
      End Set
    End Property
 
#End Region
 
#Region "Print"
 
    ''' <summary>
    ''' Erstellt eine neue Instanz der Klasse PrintFromTextBox
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
 
    End Sub
 
    ''' <summary>
    ''' Erstellt eine neue Instanz der Klasse PrintFromTextBox
    ''' </summary>
    ''' <param name="Text">Gibt das gewünschte TextBox Control an</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal Text As String)
      _Text = Text
    End Sub
 
    ''' <summary>
    ''' Druckt den Inhalt eines TextBox Controls
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Print()
      PD.Print()
    End Sub
 
    ''' <summary>
    ''' Gibt eine Druckvorschau aus
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub PrintPreviewDialog()
      Prev.Document = PD
      Prev.ShowDialog()
    End Sub
 
    ''' <summary>
    ''' Zeigt das Fenster "Seite einrichten" an
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub PageSetupDialog()
      PS.Document = PD
      PS.AllowOrientation = True
      PS.EnableMetric = True
      PS.ShowDialog()
    End Sub
 
    ''' <summary>
    ''' Zeigt das Fenster "Drucken" an
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub PrintDialog()
      PrintD.Document = PD
      PrintD.UseEXDialog = True
      PrintD.AllowSomePages = False
      PrintD.AllowCurrentPage = False
      PrintD.ShowNetwork = True
      If PrintD.ShowDialog() = DialogResult.OK Then
        For i As Integer = 0 To PrintD.PrinterSettings.MaximumCopies - 1
          PD.Print()
        Next
      End If
    End Sub
 
    Private Sub PD_PrintPage(ByVal sender As Object, _
      ByVal e As PrintPageEventArgs) Handles PD.PrintPage
 
      e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
 
      Dim left As Decimal = PD.DefaultPageSettings.Margins.Left
      Dim right As Decimal = PD.DefaultPageSettings.Margins.Right
      Dim top As Decimal = PD.DefaultPageSettings.Margins.Top
      Dim bottom As Decimal = PD.DefaultPageSettings.Margins.Bottom
 
      Dim pagewidth As Integer = PD.DefaultPageSettings.Bounds.Width - left - right
      Dim pageheight As Integer = PD.DefaultPageSettings.Bounds.Height - top - bottom
 
      Dim zeile As String = ""
      Dim Teilwort As String
      Dim wort As String
 
      Dim PosY As Integer
 
      e.Graphics.DrawRectangle(Pens.Red, left, top, pagewidth, pageheight)
      If Not FirstTime Then
        Dim TBText As String = _Text.Replace(vbNewLine, " " & vbNewLine & " ")
        wörter = TBText.Split(" ")
        AktWort = 0
        FirstTime = True
      End If
 
      e.HasMorePages = False
 
      If FirstTime Then
        zeile = ""
        wort = ""
        Do
          wort = wörter(AktWort)
          If e.Graphics.MeasureString(wort, _Font).Width > pagewidth Then
            ' Wort ist Länger als Zeile
            Teilwort = ""
            Do
              If e.Graphics.MeasureString(zeile & wort(AktBuchstabe), _
                _Font).Width < pagewidth Then
 
                zeile &= wort(AktBuchstabe)
                AktBuchstabe += 1
              Else
                ' zeile is voll
                e.Graphics.DrawString(zeile, _Font, FColor, left, top + PosY)
                PosY += e.Graphics.MeasureString(zeile, _Font).Height
 
                AktBuchstabe += 1
 
                If PosY > pageheight - e.Graphics.MeasureString(zeile, _
                  _Font).Height Then
 
                  PosY = 0
                  e.HasMorePages = True
                  Exit Sub
                End If
                zeile = ""
 
              End If
            Loop While AktBuchstabe < wort.Length
 
            ' restliche buchstaben drucken
            e.Graphics.DrawString(zeile, _Font, FColor, left, top + PosY)
 
            AktBuchstabe = 0
            ' If wörter.Length > 1 Then
            AktWort += 1
            ' End If
          Else
            If wort = vbNewLine Then
              e.Graphics.DrawString(zeile, _Font, FColor, left, top + PosY)
              PosY += e.Graphics.MeasureString(zeile, _Font).Height
              zeile = ""
              AktWort += 1
            ElseIf e.Graphics.MeasureString(zeile & wort, _Font).Width < pagewidth Then
              zeile &= wort & " "
              AktWort += 1
            Else
              ' Zeile is voll
              e.Graphics.DrawString(zeile, _Font, FColor, left, top + PosY)
              PosY += e.Graphics.MeasureString(zeile, _Font).Height
              zeile = ""
            End If
          End If
 
          If PosY > pageheight - e.Graphics.MeasureString(zeile, _Font).Height Then
            PosY = 0
            e.HasMorePages = True
            Exit Do
          End If
 
        Loop While AktWort <= wörter.Length - 1
 
        ' Letzte Zeile drucken
        e.Graphics.DrawString(zeile, _Font, FColor, left, top + PosY)
      End If
    End Sub
#End Region
 
  End Class
End Namespace

Beispiel für die Verwendung der PrintText-Klasse:

' Inhalt eines mehrzeiligen TextBox-Controls drucken
Dim oPrint As New Printing.PrintText(TextBox1.Text)
 
' hier ggf. weitere Einstellung vornehmen, wie bspw. Farbe
' ...
 
' in Seitenvorschau drucken
oPrint.PrintPreviewDialog

Credits:
Ein Dankeschön gilt auch "Silver", der an diesem Projekt mitgewirkt hat.

Dieser Tipp wurde bereits 29.148 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Aktuelle Diskussion anzeigen (7 Beiträge)

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel