Formular mit printDocument drucken

Häufig steht man vor der Frage, wie man am Besten ein Diagramm + ein wenig Text auf einem Drucker ausgeben kann. Im Netz habe ich dazu folgende Beispiele gefunden:

Grundsätzlich sollte man auf ein leeres Formular, neben 4 Buttons und einem Panel (die eigentliche Seite), folgende Objekte aus der VS-Toolbox im Abschnitt “Drucken” ziehen:

  • printDocument -> das eigentliche Objekt, um ein Dokument zum Drucken zu erstellen
  • printDialog -> Druckerauswahldialog
  • pageSetupDialog -> Seiteneinstellungen
  • printPreviewDialog -> Seitenvorschau

Folgende Einstellungen müssen noch in den Eigenschaften der u.g. Objekte getroffen werden:

  • printDocument.OriginAtMargins = true
  • printDialog.Document = printDocument
  • pageSetupDialog.EnableMetric = true
  • pageSetupDialog.Document = printDocument
  • printPreviewDialog.Document = printDocument

Auf dem Panel kann man nun nach Belieben Labels, TextBoxen, PictureBoxen usw. platzieren, diese werden dann mit ausgedruckt.

Folgender Code verdeutlicht den Ablauf:

private void btnPageSetup_Click(object sender, EventArgs e)
{
    // Seiteneinstellungen anzeigen
    pageSetupDialog.ShowDialog(); 
}

private void btnPagePreview_Click(object sender, EventArgs e)
{
    // PrinterPreview-Dialog positionieren
    printPreviewDialog.Top = this.Top;
    printPreviewDialog.Width = this.Width * 2;
    printPreviewDialog.Height = this.Height * 2;
    
    // PrinterPreview-Dialog zeigen
    printPreviewDialog.ShowDialog(); 
}

private void btnPrinterDialog_Click(object sender, EventArgs e)
{
    // Druckerauswahldialog anzeigen
    if (printDialog.ShowDialog() == DialogResult.OK)
    {
        // wenn im Dialog auf 'Druck' geklickt wurde, dann auch drucken
        printDocument.Print();
    }
}

private void btnPrint_Click(object sender, EventArgs e)
{
    // printDocument drucken
    printDocument.Print();
}

// Ereignisbehandlung des printDocument
// wird immer aufgerufen, wenn die Seitenvorschau angezeigt oder
// gedruckt werden soll
private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    // leeres Bitmap erzeugen, auf das gedruckt werden soll
    Bitmap bitmap = new Bitmap(this.Width, this.Height);

    // das Panel und alle darauf befindlichen Objekte, z.B. Labels, TextBoxen, PictureBoxen, in das Bitmap zeichnen
    pnlPage.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));

    // Skalierung einstellen
    Rectangle target = new Rectangle(0, 0, e.MarginBounds.Width, e.MarginBounds.Height);
    double xScale = (double)bitmap.Width / e.MarginBounds.Width;
    double yScale = (double)bitmap.Height / e.MarginBounds.Height;

    if (xScale < yScale)
        target.Width = (int)(xScale * target.Width / yScale);
    else
        target.Height = (int)(yScale * target.Height / xScale);

    e.Graphics.PageUnit = GraphicsUnit.Display;

    // Bitmap in das printDocument zeichnen
    e.Graphics.DrawImage(bitmap, target);
}