Rubrik: Drucker | VB-Versionen: VB.NET | 20.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: lighty | Bewertung: | Views: 33.620 |
ohne Homepage | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | 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.