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); }