Tipp-Upload: VB.NET 0218: Mehrseitigen Text drucken
von Spatzenkanonier
Ü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.
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 |
Verwendete API-Aufrufe: |
Download: |
' 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.