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:
- Galileo Computing / openbook / Visual Basic 2005
- MSDN
- Snippetcenter.org – Beispiel
- Codeproject.com – Beispiel 1
- Codeproject.com – Beispiel 2
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);
}