VB.NET-Tipp 0012: Drucken mit den .NET-Basisklassen
von Herfried Wagner
Beschreibung
Ein Beispiel zur Demonstration der Verwendung einer Druckvorschau, des Drucker-Konfigurationsdialog und des Papierformat-Einstellungsdialogs. Es kann ein zweiseitiges Beispieldokument ausgedruckt werden.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008 | Download: |
' Dieser Quellcode 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! ' Projektversion: Visual Studio 2002/2003 ' Option Strict: An ' Option Explicit: An ' ' Referenzen: ' - System ' - System.Drawing ' - System.Windows.Forms ' ' ############################################################################## ' ####################### ExtendedPrintPreviewDialog.vb ######################## ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports System.Drawing Imports System.Windows.Forms ' <remarks> ' Erweitert den Druckvorschau-Dialog ' um einige optische Effekte. ' </remarks> Public Class ExtendedPrintPreviewDialog Inherits System.Windows.Forms.PrintPreviewDialog End Class ' ############################################################################## ' ################################ MainForm.vb ################################# ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports System Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms ' <remarks> ' Hauptformular der Anwendung. ' </remarks> Public Class MainForm Inherits System.Windows.Forms.Form Private m_pd As New Printing.PrintDocument() Private m_intCurrentPage As Integer Private Sub MainForm_Load( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load With cboPrinters Dim s As String For Each s In Printing.PrinterSettings.InstalledPrinters .Items.Add(s) Next s If .Items.Count > 0 Then .SelectedIndex = 0 Else MessageBox.Show("No printers installed, quitting!", _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Me.Close() End If End With m_pd.DocumentName = "Unser erstes Dokument" AddHandler m_pd.PrintPage, AddressOf m_pd_PrintPage m_intCurrentPage = 0 End Sub Private Sub cboPrinters_SelectedIndexChanged( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles cboPrinters.SelectedIndexChanged If cboPrinters.SelectedIndex <> -1 Then m_pd.PrinterSettings.PrinterName = cboPrinters.Text End If End Sub Private Sub m_pd_PrintPage( _ ByVal sender As System.Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) m_intCurrentPage += 1 Select Case m_intCurrentPage ' Drucken der ersten Seite. Case 1 ' Zeichnen eines elliptischen Bereichs ' über die gesamte Seite (ohne Randabstände). e.Graphics.FillEllipse( _ New Drawing2D.HatchBrush( _ HatchStyle.Percent10, _ Color.Red, _ Color.White _ ), _ e.MarginBounds _ ) ' Text genau in der Mitte der Seite ausgeben. ' Je nach Randabständen muss das ' nicht unbedingt genau in der Mitte der Ellipse sein! Dim strText As String = "Das ist die Seite 1" Dim fntFont As New Font("Arial", 18) e.Graphics.DrawString( _ strText, _ fntFont, _ New SolidBrush(Color.Blue), _ CSng( _ ( _ e.PageBounds.Width - _ e.Graphics.MeasureString(strText, fntFont).Width _ ) * 0.5 _ ), _ CSng(200) _ ) ' Es folgen noch weitere Seiten. e.HasMorePages = True ' Drucken der zweiten Seite. Case 2 ' Seitennummer im linken oberen Eck ausgeben. e.Graphics.DrawString( _ "Seite 2", _ New Font("Times New Roman", 12), _ New SolidBrush(Color.Black), _ e.MarginBounds.Left, _ e.MarginBounds.Top _ ) ' Das war die letzte Seite. e.HasMorePages = False ' Seitenzähler wieder zurücksetzen. m_intCurrentPage = 0 End Select End Sub Private Sub btnPrint_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnPrint.Click m_pd.Print() End Sub Private Sub btnPreview_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnPreview.Click ' Seitenzähler initialisieren. m_intCurrentPage = 0 ' Vorschaudialog erstellen und anzeigen. Dim ppdlg As ExtendedPrintPreviewDialog = _ New ExtendedPrintPreviewDialog() With ppdlg ' Der Druckvorschau das Dokument zuweisen. .Document = m_pd ' Die Druckvorschau soll maximiert gezeigt werden. .WindowState = FormWindowState.Maximized ' Druckvorschau anzeigen. .ShowDialog(Me) End With End Sub Private Sub btnChoosePrinter_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnChoosePrinter.Click Dim pdlg As PrintDialog = New PrintDialog() With pdlg ' Dokument an Printerdialog weiterreichen. .Document = m_pd .PrinterSettings = m_pd.PrinterSettings .AllowPrintToFile = False If .ShowDialog(Me) = DialogResult.OK Then ' Die Einstellungen in unserem ' Formular werden nun angepasst... SelectPrinter(cboPrinters, .PrinterSettings.PrinterName) End If End With End Sub Private Sub btnPageSetup_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnPageSetup.Click Dim psdlg As PageSetupDialog = New PageSetupDialog() With psdlg .PrinterSettings = m_pd.PrinterSettings .PageSettings = m_pd.DefaultPageSettings If .ShowDialog(Me) = DialogResult.OK Then ' Hier wird ein Fehler (?!) ausgebügelt: VB .NET ' konvertiert anscheinend alle Werte von Inch in ' Millimeter, da (vermutlich) im englischen Dialog ' die(Werte) in Inch eingegeben werden. Allerdings ' ist der Umrechnungsfaktor nicht genau Inch:Millimeter, ' sondern etwas mehr, sodass beim Wert 10 bei ' erneutem Aufruf 9.9 in der TextBox steht. .PageSettings.Margins = _ Printing.PrinterUnitConvert.Convert( _ .PageSettings.Margins, _ Drawing.Printing.PrinterUnit.ThousandthsOfAnInch, _ Drawing.Printing.PrinterUnit.HundredthsOfAMillimeter) ' Die Einstellungen in unserem Formular ' werden nun angepasst... SelectPrinter(cboPrinters, .PrinterSettings.PrinterName) End If End With End Sub ' <summary> ' Wählt den in <paramref name="strPrinterName"/> ' angegebenen Drucker in den Einträgen ' der im Parameter <paramref name="cboComboBox"/> ComboBox aus. ' </summary> ' <param name="cboComboBox"></param> ' <param name="strPrinterName"></param> Private Sub SelectPrinter( _ ByVal cboComboBox As ComboBox, _ ByVal strPrinterName As String) Dim i As Integer For i = 0 To cboComboBox.Items.Count - 1 If Convert.ToString(cboComboBox.Items(i)) = strPrinterName Then cboComboBox.SelectedIndex = i Exit For End If Next i End Sub End Class
Ihre Meinung
Falls Sie Fragen zu diesem Artikel 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.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 6 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Simon_G am 13.08.2007 um 11:44
Hi,
ich würd mal gerne überhaupt irgendwas drucken :-(
Am liebsten einfach mal nur die Form1 aber ich finde einfach keinen Befehl, der das macht.
Kommentar von roland_k am 15.03.2007 um 18:47
das beispiel endet mit: Fehler in:
Dim b As Button = DirectCast(.Controls(1).Controls(2), Button)
Meldung code veraltet
ich habe vb.net2005 express
gruss
roland_k
wird das hier nicht beantwortet ?
Kommentar von roland_k am 08.03.2007 um 05:59
hi Herfried,
ich habe das listung runtergeladen.
meine version = vb.net2005 express
bei starten bleibt der debugger stehn bei:
Option Explicit On
Option Strict On
Option Compare Binary
Imports System.Drawing
Imports System.Windows.Forms
' <remarks>
' Erweitert den Druckvorschau-Dialog
' um einige optische Effekte.
' </remarks>
Public Class ExtendedPrintPreviewDialog
Inherits System.Windows.Forms.PrintPreviewDialog
#Region " Vom Windows Form Designer generierter Code "
Public Sub New()
MyBase.New()
InitializeComponent()
' Einige Anpassungen vornehmen. Vor Allem der Schliessen-Button ist etwas mager
' ausgefallen, daher wird er im Systemstyle dargestellt und an den unteren
' Rand des Dialogs gerückt.
'With Me
' 'Dim b As Button = DirectCast(.Controls(1).Controls(2), Button)
' b.Location = New Point(0, 0)
' b.FlatStyle = FlatStyle.System
' Me.MinimumSize = New Size(Me.MinimumSize.Width - b.Width, Me.MinimumSize.Height)
' Dim p As Panel = New Panel()
' b.Size = New Size(80, 24)
' p.Size = b.Size
' p.Controls.Add(b)
' b.Anchor = AnchorStyles.None
' p.Height = 40
' p.Dock = DockStyle.Bottom
' .Controls.Add(p)
' With DirectCast(.Controls(1), ToolBar)
' .Buttons.RemoveAt(8)
' .Divider = False
' End With
'End With
End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
Private components As System.ComponentModel.IContainer
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.SuspendLayout()
'
'ExtendedPrintPreviewDialog
'
Me.AutoScaleDimensions = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(400, 300)
Me.Name = "ExtendedPrintPreviewDialog"
Me.ResumeLayout(False)
End Sub
#End Region
End Class
Fehler in der Zeile:
' 'Dim b As Button = DirectCast(.Controls(1).Controls(2), Button)
index ausserhalb des bereich,
was mache ich da falsch ?
danke
gruss
roland_k
Kommentar von Roland am 12.05.2006 um 13:32
Hallo RENI
Danke, super tip!
Hatte ein ähnliches Problem bei der Benutzung von vb6 Steuerelementen, die bei der Ausführung von einem Netzlaufwerk eine SecurityException auslösten, lokal war alles ok. Nachdem mscorlib.dll und die Dlls der Steuerelemente voll vertrauenswürdig eingestellt wurden klappte es auch übers Netz.
Gruß
Roland
Kommentar von RENI am 22.07.2005 um 13:06
Hallo Udo
Du musst die Vertrauensstufe der DLL höher setzen.
Öffne hierzu den .NET Framework Assistenten(Systemsteuerung/Verwaltung)
und weise der DLL die Berechtigung "voll vertrauenswürdig" zu.
Gruß
RENI
Kommentar von Udo am 12.01.2005 um 11:02
Hallo zusammen,
ich versuche gerade das erste Mal aus VB.NET die Drucker-Settings rauszukriegen. Ich möchte die Liste der installierten Drucker in eine ComboBox eintragen.
Der Tipp0012 schien mir das recht hilfreich. Doch leider bleibt der Debugger immer an folgender Stelle stehen:
"For Each s In Printing.PrinterSettings.InstalledPrinters "(Zeile 128)
Es erscheint die für mich nichtssagende Fehlermeldung:
Eine nicht behandelte Ausnahme des Typs 'System.Security.SecurityException' ist in mscorlib.dll aufgetreten.
Zusätzliche Informationen: Anforderung des Berechtigungstyps System.Drawing.Printing.PrintingPermission, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ist fehlgeschlagen.
Liegt da ein Fehler im Code von TIP0012 vor, oder liegt das Problem irgendwo bei mir?
Danke schon mal für die Hilfe!