Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einführung
2 Grundlagen der Sprachsyntax
3 Klassendesign
4 Weitere Datentypen
5 Multithreading
6 Collections und LINQ
7 Eingabe und Ausgabe
8 Anwendungen: Struktur und Installation
9 Code erstellen und debuggen
10 Einige Basisklassen
11 Windows-Anwendungen erstellen
12 Die wichtigsten Steuerelemente
13 Tastatur- und Mausereignisse
14 MDI-Anwendungen
15 Grafiken mit GDI+
16 Drucken
17 Entwickeln von Steuerelementen
18 Programmiertechniken
19 WPF – Grundlagen
20 Layoutcontainer
21 WPF-Steuerelemente
22 Konzepte von WPF
23 Datenbankverbindung mit ADO.NET
24 Datenbankabfragen mit ADO.NET
25 DataAdapter
26 Offline mit DataSet
27 Datenbanken aktualisieren
28 Stark typisierte DataSets
A Anhang: Einige Übersichten
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual Basic 2008 von Andreas Kuehnel, Stephan Leibbrandt
Das umfassende Handbuch
Buch: Visual Basic 2008

Visual Basic 2008
3., aktualisierte und erweiterte Auflage, geb., mit DVD
1.323 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1171-0
Pfeil 16 Drucken
Pfeil 16.1 Überblick
Pfeil 16.1.1 PrintDocument
Pfeil 16.1.2 PrinterSettings
Pfeil 16.1.3 PageSettings
Pfeil 16.2 Einen Druckauftrag erteilen
Pfeil 16.2.1 Methoden und Eigenschaften von PrintDocument
Pfeil 16.2.2 Die Ereignisse in PrintDocument
Pfeil 16.2.3 Die Ereignisse BeginPrint und EndPrint
Pfeil 16.2.4 Das Ereignis QueryPageSettings
Pfeil 16.2.5 Das Ereignis PrintPage
Pfeil 16.2.6 Beenden des Druckauftrags
Pfeil 16.2.7 WYSIWYG
Pfeil 16.3 Seiteneinstellungen mit PageSettings
Pfeil 16.4 Der Drucker als PrinterSettings
Pfeil 16.4.1 Mehrere installierte Drucker
Pfeil 16.4.2 Eigenschaften von PrinterSettings
Pfeil 16.5 Steuerelemente zum Drucken
Pfeil 16.5.1 PrintDocument
Pfeil 16.5.2 PrintDialog
Pfeil 16.5.3 PageSetupDialog
Pfeil 16.5.4 PrintPreviewDialog
Pfeil 16.5.5 PrintPreviewControl
Pfeil 16.6 Drucken von Grafiken
Pfeil 16.6.1 Das Problem der Maßeinheiten
Pfeil 16.6.2 Festlegung der Einheiten und Skalierung
Pfeil 16.6.3 Größenrichtige Ausgabe einer Grafik
Pfeil 16.7 Mehrseitiger Text


Galileo Computing - Zum Seitenanfang

16.7 Mehrseitiger Text topZur vorigen Überschrift

Den Abschluss der Druckthematik bildet ein Beispiel, das den Inhalt einer Textbox formatiert ausgibt und außerdem berücksichtigt, dass der Ausdruck mehrere Druckseiten lang sein kann. Das Programm lädt eine Textdatei in eine Textbox und druckt den Text aus. Zusammen mit Abschnitt 12.12.1, »Datei zum Öffnen wählen (OpenFileDialog)«, Abschnitt 12.12.2, »Datei zum Speichern wählen (SaveFileDialog)« und Abschnitt 18.4, »Die Zwischenablage«, haben Sie einen Startpunkt zur Entwicklung eines Texteditors.

Sehen wir uns nun den Programmcode zusammengefasst an – zunächst nur die Passagen, die keiner genaueren Erklärung bedürfen. Dazu gehört nicht der Ereignishandler des PrintPage-Ereignisses, den wir anschließend Zeile für Zeile behandeln. Der Einfachheit halber habe ich auf die komplette Fehlerbehandlung verzichtet.


'...\Drucken\Druck\Textdateien.vb

Imports System.Drawing.Printing 
Public Class Textdateien 
  Private Sub Neu_Click(sender As Object, e As EventArgs) Handles Neu.Click 
    Textfenster.Text = "" 
    Text = "Unbenannt" 
  End Sub

  Private Sub Öffnen_Click(sender As Object, e As EventArgs) _ 
  Handles Öffnen.Click 
    Dim ofd As New OpenFileDialog() 
    ofd.Filter = "Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*" 
    ofd.Title = "Öffnen einer Textdatei" 
    If ofd.ShowDialog() = DialogResult.OK Then 
      Textfenster.Text = IO.File.ReadAllText( _ 
        ofd.FileName, System.Text.Encoding.Default) 
      Text = ofd.FileName 
    End If 
  End Sub

  Private WithEvents doc As New PrintDocument() 
  Private zuDrucken As String 
  Private von, bis, nummer As Integer 
  Private Sub Drucken_Click(sender As Object, e As EventArgs) _ 
  Handles Drucken.Click 
    Dim d As New PrintDialog() : d.Document = doc : d.AllowSomePages = True 
    If d.ShowDialog() = DialogResult.OK Then 
      doc.DocumentName = Text & " " & Now 
      zuDrucken = Textfenster.Text 
      Select Case d.PrinterSettings.PrintRange 
        Case PrintRange.AllPages 
          von = 1 : bis = d.PrinterSettings.MaximumPage 
        Case PrintRange.SomePages 
          von = d.PrinterSettings.FromPage : bis = d.PrinterSettings.ToPage 
      End Select 
      nummer = 1 
      doc.Print() 
    End If 
  End Sub

  Private Sub Einrichten_Click(sender As Object, e As EventArgs) _ 
  Handles Einrichten.Click 
    Dim d As New PageSetupDialog() : d.Document=doc : d.EnableMetric=True 
    d.ShowDialog() 
  End Sub

  Private Sub Seitenansicht_Click(sender As Object, e As EventArgs) _ 
  Handles Seitenansicht.Click 
    Dim p As New PrintPreviewDialog() : p.Document = doc 
    Dim d As New PrintDialog() : d.Document = doc : d.AllowSomePages = True 
    zuDrucken = Textfenster.Text 
    von = 1 
    bis = d.PrinterSettings.MaximumPage 
    nummer = 1 
    p.ShowDialog() 
  End Sub 
  ... 
End Class

Der Ereignishandler von PrintPage

Im PrintPage-Ereignishandler befindet sich die gesamte Steuerung des Druckvorgangs. Dazu gehören die Ermittlung der für den Textausdruck zur Verfügung stehenden Rechteckfläche und die Anzahl der Druckzeilen jeder Seite. Dabei darf die letzte Zeile der Seite nicht abgeschnitten werden. Zusätzlich soll jede gedruckte Dokumentenseite eine Kopfzeile mit dem Dateinamen enthalten und in einer Fußzeile die aktuelle Seitenzahl anzeigen.

Nach der Deklaration einiger lokaler Variablen, die innerhalb des Ereignishandlers benötigt werden, wird der Druckbereich des gesamten Ausdrucks festgelegt.

außen = e.MarginBounds

innen legt die Größe des Rechtecks fest, in dem der Text aus der Textbox ausgedruckt wird. Die Methode Inflate der Klasse Rectangle vergrößert/verkleinert eine Rechteckfläche. In unserem Fall subtrahieren wir Kopf- und Fußzeile.

innen = RectangleF.Inflate(außen, 0, –2 * ft.GetHeight(e.Graphics))

Die Anzahl der Zeilen muss in jedem Fall durch eine ganze Zahl beschrieben werden. Durch eine ganzzahlige Division erhalten wir die gerade passenden Zeilen. Alternativ können Sie die klassengebundene Methode Floor der Klasse Math verwenden.

Dim anzahlZeilen As Integer = innen.Height \ ft.GetHeight(e.Graphics)

Nun können wir den Ausdruck beginnen. Nur Seiten im gewünschten Bereich erscheinen. Deshalb wird der Ausdruck von einer If-Anweisung umschlossen.

If nummer >= von AndAlso zuDrucken.Length >= 0 Then 
  ... 
End If

Der Ausdruck besteht aus drei Teilen. Zuerst wird der normale Text gedruckt. Es wird ein Formatierungsobjekt übergeben, damit kein Wort in der Mitte abgeschnitten wird.

form.Trimming = StringTrimming.Word 
e.Graphics.DrawString(zuDrucken, ft, Brushes.Black, innen, form)

Danach werden Kopf- und Fußzeilen gedruckt. Die Kopfzeile wird zentriert ausgegeben.

form.Alignment = StringAlignment.Center 
e.Graphics.DrawString(Text, ft, Brushes.Black, außen, form)

Die Fußzeile wird rechtsbündig formatiert.

form.LineAlignment = StringAlignment.Far 
e.Graphics.DrawString("S " & nummer, ft, Brushes.Black, außen, form)

Nachdem der Text gedruckt worden ist (oder der Ausdruck übersprungen wurde), wird er aus dem zu druckenden Resttext entfernt. Dadurch kann jede Seite so tun, als beginne sie am Anfang des Textes. Korrespondierend zum Ausdruck wird wortweise formatiert. Die Anzahl Zeilen, die auf die Seite passen, wird mit MeasureString ermittelt.

form.Trimming = StringTrimming.Word 
e.Graphics.MeasureString(zuDrucken,ft,innen.Size,form,zeichen,zeilen) 
zuDrucken = zuDrucken.Substring(zeichen)

Danach wird die Seitenzahl erhöht und zur nächsten Seite fortgeschritten. Wenn der Ausdruck übersprungen wurde, druckt die Methode Druck die nächste Seite. Auf diese Weise wird die Auslösung des PrintPage-Ereignisses vermieden und wird keine leere Seite ausgegeben. Wurde eine Seite ausgegeben, wird in HasMorePages gespeichert, Gibt an, ob weitere Seiten folgen.

nummer += 1 
If nummer – 1 < von Then 
  Druck(sender, e) 
Else 
  e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis 
End If

Damit ist das PrintPage-Ereignis fertig implementiert. Der Programmcode sieht vollständig wie folgt aus:


'...\Drucken\Druck\Textdateien.vb

Imports System.Drawing.Printing 
Public Class Textdateien 
  ... 
  Private Sub Druck(ByVal sender As Object, ByVal e As PrintPageEventArgs) _ 
  Handles doc.PrintPage 
    Dim ft As Font = Textfenster.Font 
    Dim form As New StringFormat() 
    Dim außen, innen As RectangleF 
    Dim zeichen, zeilen As Integer 
    ' umschreibendes Rechteck des Druckbereichs (mit/ohne Kopf+Fußzeile) 
    außen = e.MarginBounds 
    innen = RectangleF.Inflate(außen, 0, –2 * ft.GetHeight(e.Graphics)) 
    ' Anzahl vollständig passender Druckzeilen ermitteln und Höhe anpassen 
    Dim anzahlZeilen As Integer = innen.Height \ ft.GetHeight(e.Graphics) 
    innen.Height = anzahlZeilen * Textfenster.Font.GetHeight(e.Graphics) 
    ' Seite drucken (automatisch abgeschnitten durch form) 
    If nummer >= von AndAlso zuDrucken.Length >= 0 Then 
      ' zu langen Text hinter dem letztem vollständig passenden Wort kappen 
      form.Trimming = StringTrimming.Word 
      e.Graphics.DrawString(zuDrucken, ft, Brushes.Black, innen, form) 
      ' Dateiname in der Kopfzeile anzeigen 
      form.Alignment = StringAlignment.Center 
      e.Graphics.DrawString(Text, ft, Brushes.Black, außen, form) 
      ' Seitennummer in der Fußzeile anzeigen 
      form.LineAlignment = StringAlignment.Far 
      e.Graphics.DrawString("S " & nummer, ft, Brushes.Black, außen, form) 
    End If 
    ' gedruckten Text aus Drucktext nehmen; zeichen/zeilen: Größe der Seite 
    form.Trimming = StringTrimming.Word 
    e.Graphics.MeasureString(zuDrucken,ft,innen.Size,form,zeichen,zeilen) 
    zuDrucken = zuDrucken.Substring(zeichen) 
    nummer += 1 
    If nummer – 1 < von Then 
      Druck(sender, e) 
    Else 
      e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis 
    End If 
  End Sub

End Class


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual Basic 2008
Visual Basic 2008
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Visual Basic 2012






 Visual Basic 2012


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de