Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0012: Drucken mit den .NET-Basisklassen

 von 

Beschreibung

Ein Beispiel zur Demonstration der Verwendung einer Druckvorschau, des Drucker-Konfigurationsdialog und des Papierformat-Einstellungsdialogs. Es kann ein zweiseitiges Beispieldokument ausgedruckt werden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

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:

Download des Beispielprojektes [6,4 KB]

' 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!