Drucken unter .NET
von Alex Frankenberger
Übersicht
Dieses kurze Tutorial behandelt das Drucken unter .NET. Druckvorschau, Auswahl des Druckers und Positionierung.
Mit freundlichen Grüßen
Alex Frankenberger alex@cw-world.de
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
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"
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
Der Aufruf der Print-Funktion:
lPD.Print()
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
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)
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
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
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
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.
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.