Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0218: Mehrseitigen Text drucken

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Drucker
  • Grafik

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Druckeneinstellungen, Druckvorschau, Seitenränder, MeasureString

Damit er übernommen werden kann, müssen noch Änderungen daran vorgenommen werden. Sofern Sie der Autor sind, können Sie sich anmelden, um die Liste einzusehen.

Der Vorschlag wurde erstellt am: 09.03.2008 17:17.
Die letzte Aktualisierung erfolgte am 27.03.2008 07:19.

Zurück zur Übersicht

Beschreibung  

Mit diesem Tipp werden die aus .NET ansprechbaren Druckdialoge vorgestellt.
Das eigentliche Drucken ist im Grunde ein Zeichenvorgang: Im PrintDocument.DrawPage()-Ereignis bekommt man ein Graphics-Objekt bereitgestellt, auf dem (auf dem verfügbaren Platz) der Druck als Zeichnung auszuführen ist.

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [20,03 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------------ Anfang Projektgruppe PrintText.sln ------------
' ----------- Anfang Projektdatei PrintText.vbproj -----------
' --------------- Anfang Datei frmPrintText.vb ---------------
' IDE-Voreinstellungen:
' Option Explicit On
' Option Strict On

' "My Project"-Einstellungen:
' Imports Microsoft.VisualBasic
' Imports Microsoft.VisualBasic.ControlChars
' Imports System.Windows.Forms

Imports System.IO

Public Class frmPrintText

    Private _CharsPrinted As Integer

    Private Sub frmPrintText_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

        ' als Text nehme ich einfach die Projekt-Datei
        Dim DirUP As String = ".." & Path.DirectorySeparatorChar

        Dim ProjFile As String = String.Concat(Path.GetFileNameWithoutExtension( _
            Application.ExecutablePath), ".vbproj")

        RichTextBox1.Text = FileIO.FileSystem.ReadAllText(String.Concat(DirUP, DirUP, ProjFile))

        ' Sowohl per PrintDialog1 als auch per PageSetupDialog1 kann man PrinterSettings festlegen
        ' Zur Vermeidung von Redundanz müssen beide dasselbe PrinterSettings-Objekt verwenden.
        PrintDialog1.PrinterSettings = PageSetupDialog1.PrinterSettings
        PrintPreviewDialog1.WindowState = FormWindowState.Maximized

    End Sub

    Private Sub ToolstripButton_Click(ByVal sender As Object, ByVal e As EventArgs) _
                Handles btPageSettings.Click, btPreview.Click, btSelectPrinter.Click, btPrint.Click

        ' Wichtig: Bei allen Druck-Dialogen (PrintDialog, PageSetupDialog, PrintPreviewDialog)
        ' ist im Designer die .Document - Property auf PrintDocument1 festgelegt.
        Select Case True

            Case sender Is btPageSettings
                PageSetupDialog1.ShowDialog()

            Case sender Is btPreview
                _CharsPrinted = 0
                PrintPreviewDialog1.ShowDialog()

            Case sender Is btSelectPrinter

                ' PrintDialog ist zweigesichtig: Ist UseExDialog=True eingestellt (leider
                ' Voreinstellung) erscheint ein erweiterter PrintDialog, der weiter zur
                ' Druck-Ausgabe führen soll.
                ' Normalerweise ist vor einem Druck eine Drucker-Wahl aber gar nicht erforderlich
                ' (schon gar nicht vor **jedem** Druck), da eh der Standard-Drucker verwendet
                ' werden soll.
                PrintDialog1.ShowDialog()

            Case sender Is btPrint
                _CharsPrinted = 0
                PrintDocument1.Print()

        End Select

    End Sub

    Private Sub PrintDocument1_PrintPage( _
                ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs) _
                Handles PrintDocument1.PrintPage

        Dim SF As StringFormat = StringFormat.GenericDefault
        Dim Ft As Font = RichTextBox1.Font
        Dim G As Graphics = e.Graphics
        Dim AllowedHeight As Integer = e.MarginBounds.Height
        Dim SB As New System.Text.StringBuilder(RichTextBox1.Text.Substring(_CharsPrinted))
        Dim LinesFilled, CharsFitted As Integer ' werden von MeasureString() eingetragen (ByRef)

        Dim Sz As SizeF = G.MeasureString(SB.ToString, Ft, e.MarginBounds.Size, SF, _
            CharsFitted, LinesFilled)

        ' Sinnigerweise zählt MeasureString() auch nur halb dargestellte Characters als "fitted".
        ' Da wir das beim Drucken anders sehen, Gegenprobe (Messung innerhalb einer quasi nach
        ' unten offenen Size):
        Sz.Height = Short.MaxValue

        While G.MeasureString(SB.ToString(0, CharsFitted), Ft, Sz, SF).Height > AllowedHeight
            CharsFitted -= 1

        End While

        G.DrawString(SB.ToString(0, CharsFitted), Ft, Brushes.Black, e.MarginBounds, SF)
        _CharsPrinted += CharsFitted
        e.HasMorePages = RichTextBox1.TextLength > _CharsPrinted

    End Sub

End Class

' ---------------- Ende Datei frmPrintText.vb ----------------
' ------------ Ende Projektdatei PrintText.vbproj ------------
' ------------- Ende Projektgruppe PrintText.sln -------------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.