Die Community zu .NET und Classic VB.
Menü

Drucken unter .NET

 von 

Übersicht 

Dieses kurze Tutorial behandelt das Drucken unter .NET. Druckvorschau, Auswahl des Druckers und Positionierung.

Mit freundlichen Grüßen
Alex Frankenberger

Verfügbare Drucker  

Die Frage "Wie bekomme ich eine Liste der verfügbaren Drucker" ist leicht erklärt:
Mit der Klasse "PrinterSettings" können Sie die installierten Drucker auflisten:

'Eine Combobox mit dem Namen cbDrucker muß auf der Form vorhanden sein.
Private Sub GetInstalledPrinters()
    ' Liste der installierten Drucker in eine Combobox schreiben
    Dim lS As String
    For Each lS In PrinterSettings.InstalledPrinters
        cbDrucker.Items.Add(lS)
    Next
End Sub


Private Sub cbDrucker_SelectionChanged(ByVal sender _
            As System.Object, _
            ByVal e As System.EventArgs) _
            Handles cbDrucker.SelectedIndexChanged
    ' Der Drucker für das aktuell zu druckende Dokument
    ' (printDoc) wird auf den ausgewählten Drucker gesetzt
    If cbDrucker.SelectedIndex <> -1 Then
        ' im Combobox-Text steht der Name des Druckers
        printDoc.PrinterSettings.PrinterName = cbDrucker.Text
    End If
End Sub

Listing 1

Der erste Ausdruck  

Der Ausdruck von Daten erfordert die Klasse System.Drawing.Printing.PrintDocument . Der Ablauf des Drucks ist etwas gewöhnungsbedürftig: zuerst wird die Print-Routine aufgerufen. Diese löst das Ereignis PrintPage aus, bevor eine Seite ausgedruckt wird. In der Callback-Funktion, die mit diesem Ereignis verknüpft werden muß, kann der Entwickler jetzt die Seite füllen. Beispiel:

Vorbereitende Arbeiten:

' Zähler für die Seitenzahl, als Membervariable in der Klasse definiert
Private m_AktPage As Long

...

' Zuerst die Definition des Dokuments
Dim lPD As New System.Drawing.Printing.PrintDocument()
lPD.DocumentName = "Name des Dokuments"

Listing 2

Der Name des Dokuments erscheint in der Druckerwarteschlange. Jetzt die Zuweisung der Callback-Funktion:

' Die Funktion PDPrintPage wird jedesmal aufgerufen, bevor das
' Dokument eine neue Seite drucken will.
AddHandler lPD.PrintPage, AddressOf PDPrintPage

' Seitenzahl in eigener Variable initialisieren
m_AktPage = 0

Listing 3

Der Aufruf der Print-Funktion:

lPD.Print()

Listing 4

Die Funktion fängt jetzt an zu drucken. Sobald die erste Seite gedruckt werden soll, wird die Callback-Funktion (der "Handler") aufgerufen. Dieser Handler sieht so aus:

Private Sub PDPrintPage(ByVal sender As System.Object, _
                        ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    ' Hier die entsprechende Seite füllen
    Dim lBrush = New SolidBrush(Color.Black)
    Dim lFontNorm As Font = New Font("Arial", 10)

    m_AktPage += 1

    ' Umstellen der Maßeinheit auf Millimeter
    e.Graphics.PageUnit = GraphicsUnit.Millimeter

    Select Case m_AktPage
    Case 1:
      ' Druck erfolgt auf der ersten Seite
        e.Graphics.DrawString ("Seite 1", lFontNorm, lBrush, 100, 200)
        e.HasMorePages = True
    Case 2:
        ' Druck erfolgt auf der zweiten Seite
        e.Graphics.DrawString ("Seite 2", lFontNorm, lBrush, 100, 200)
        e.HasMorePages = False

        ' Anfangszustand wiederherstellen, wichtig für _
        Druckvorschau (siehe unten)
        m_AktPage = 0
    End Select
End Sub

Listing 5

Mit e.HasMorePages = True wird dem Dokument mitgeteilt, daß noch mehr Seiten kommen und der Handler bitteschön nochmals aufzurufen ist.

Der oben gezeigte Druckhandler würde also zwei Seiten ausdrucken, eine mit dem Text "Seite 1", 100 Millimeter vom linken und 200 Millimeter vom oberen Rand weg. An der gleichen Position steht dann auf der nächsten Seite "Seite 2".

Die Klasse PrintPageEventArgs hält noch einige wichtige Members bereit. Hier eine kleine Liste:

Member Bedeutung
Cancel True -> Druckauftrag wird abgebrochen
MarginBounds gibt ein Rectangle zurück, das die Randeinstellungen für die aktuelle Seite darstellt. Kann mit der Klasse Margins gesetzt werden
PageBounds gibt ein Rectangle zurück, das die Größe der aktuellen Seite darstellt. Kann mit der Klasse Margins gesetzt werden
PageSettings für grundlegende Seiteneinstellung der aktuellen Seite
Landscape - Ausrichtung
Color - Farbausdruck
Papersize - Papiermaße
PrinterSettings - Druckereinstellungen
Graphics Eine Klasse, die Objekte auf bestimmten Geräten ausgibt. Siehe Kasten unten.

Tabelle 1

Der Member Graphics ist ein zentraler Teil dieser Klasse. Graphics stellt alle Routinen zur Verfügung, die für die Ausgabe von Objekten auf beliebigen Geräten gebraucht werden. Einige Methoden der Klasse PrintPageEventArgs.Graphics :

Member Bedeutung
Pageunit Maßeinheit, mit der die Koordinaten gesetzt werden. Der Typ von PageUnit ist der Aufzählungstyp GraphicsUnit. Mögliche Einstellungen sind z.B. Pixel, Inch oder Millimeter.
DrawString
DrawImage
DrawLine
Für jeden Ausgabetyp existiert eine eigene Funktion. Hier nur die wichtigsten drei. Bei DrawString kann neben den Koordinaten der Ausgabe und dem zu benutzenden Font auch noch ein Parameter des Typs Stringformat übergeben werden, der den Ausdruck steuert. Siehe unten.

Tabelle 2

Der wichtigste Member bei der Klasse Stringformat ist Alignment :

Member Bedeutung
Alignment Property vom Typ StringFormat (Aufzählung)
Steuert die Ausrichtung des Textes bei den angegebenen Koordinaten.
Mögliche Einstellungen:
Center: Zentriert
Far: Rechtsbündig
Near: Linksbündig
Near und Far werden benutzt, um auch bei Rechts-nach-links Schrift mit diesen Einstellungen arbeiten zu können. Far bedeutet eben, daß der Text bei Links-Rechts-Basierenden Systemen rechts zentriert wird, bei anderen Systemen links.

Tabelle 3

Beispiel: Der Text "Umsatz-Prognose" soll auf der Seite zentriert am oberen Rand platziert werden. Im Seitenhandler sieht das etwa so aus:

Dim lX As Long
    Dim lY As Long
Dim lDrawFormat As New StringFormat()
Dim lBrush = New SolidBrush(Color.Black)
Dim lFontNorm As Font = New Font("Arial", 10)


    ' Druckkoordinate X: Rechter Rand + Hälfte der Seitenbreite
    lX = e.MarginBounds.Left + (e.MarginBounds.Width / 2)
    ' Druckkoordinate Y: Oberer SeitenRand
    lY = e.MarginBounds.Top

    ' Stringausrichtung auf zentriert einstellen
    lDrawFormat.Alignment = StringAlignment.Center
    lString = "Umsatz-Prognose"

    ' String ausgeben
    e.Graphics.DrawString(lString, lFontNorm, m_Brush, lX, vY, lDrawFormat)

Listing 6

Druckvorschau  

Die Druckvorschau kann dank DotNet sehr einfach realisiert werden. Dazu wird einer Instanz der Klasse PrintPreviewDialog das aktuelle Druckdokument zugewiesen. Statt jetzt die Print-Funktion des PrintDocument aufzurufen, zeigen Sie jetzt den PrintPreview-Dialog an.

Hier einmal der Ablauf:

Private Sub DruckRoutine()
        Dim lPD As New System.Drawing.Printing.PrintDocument()
        lPD.DocumentName = "DotNet-Dokument"

        Dim lPP As PrintPreviewDialog
        lPP = New PrintPreviewDialog()
        lPP.Document = lPD

        ' Seitenzähler auf Anfangswert!
        m_AktPage = 0

        ' Das Dokument mit seinem Handler verbinden
        AddHandler lPD.PrintPage, AddressOf PDPrintPage

        ' Die Seiten des Druckbereichs festlegen
        Dim lMargins As Margins = New Margins(200, 190, 190, 200)
        lPD.DefaultPageSettings.Margins = lMargins

        With lPP
            ' Der Druckvorschau das Dokument zuweisen
            .Document = lPD
            ' Die Druckvorschau soll maximiert gezeigt werden
            .WindowState = FormWindowState.Maximized
            ' Druckvorschau anzeigen
            .ShowDialog(Me)
        End With

        lPP = Nothing
        lPD = Nothing
End Sub

Listing 7

Zu beachten ist folgendes:
Die Druckvorschau benutzt die Seitendruckroutine PDPrintPage, die durch die Funktion AddHandler dem Dokument zugewiesen wurde. Mit dem Seitenhandler wird die Vorschau gefüllt. Beim Ausdruck des Dokuments wird dann der komplette Druckprozess noch einmal durchlaufen. Das hat vor allem Auswirkungen auf den Seitenzähler. Also darauf achten: Nach dem Abschluß des Drucks mit der Seitenhandler-Routine alle Werte wieder auf Anfangsposition setzen.

Auswahldialog des Printers  

Der Printerauswahldialog kann mit folgender Routine aufgerufen werden:

' PrintDialog!
Dim lPrinterName As String
Dim lPDialog As PrintDialog


lPDialog = New PrintDialog()
lPDialog.AllowPrintToFile = False
lPDialog.ShowDialog()

' Den Namen des ausgewählten Druckers holen
lPrinterName = lPDialog.PrinterSettings.PrinterName
lPDialog = Nothing

Listing 8

Damit der Drucker automatisch einem Dokument zugeordnet werden kann, muß die Document-Eigenschaft des PrinterDialog-Objekts mit dem Druckdokument verbunden werden.

' PrintDialog!
Dim lPrinterName As String
Dim lPDialog As PrintDialog
Dim lPD As PrintDocument = New PrintDocument()

lPDialog = New PrintDialog()
' Dokument an Printerdialog weiterreichen
lPDialog.Document = lPD
lPDialog.AllowPrintToFile = False
lPDialog.ShowDialog()
lPDialog = Nothing

' Das Dokument druckt jetzt auf den ausgewählten Drucker
' Der Name des ausgewählten Druckers kann über 
' PrinterSettings geholt werden
lPrinterName = lPD.PrinterSettings.PrinterName

Listing 9

Zusammenfassung  

Das hier vorliegende Tutorial sollte als Einführung in die neue (Drucker-)Welt von .NET gelten, unterscheidet es sich doch wesentlich von VB5 oder VB6.

Beispielprojekt  

Von pks gibt es zu diesem Tutorial einen passenden Tipp: Listview drucken

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.