La stampa in Microsoft .Net 4 VB.Net e C#

Articolo che illustra l'utilizzo della stampa con la tecnologia Microsoft .Net 4.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Introduzione.



In questo articolo, vedremo l’utilizzo della stampa tramite la tecnologia .Net 4 ed i linguaggi Visual Basic Net e C#.
L’articolo vuole fornire al lettore le conoscenze di base ed in particolare sull’utilizzo della stampa in ambiente Windows Application, in particolare vedremo come stampare immagini e testo tramite .Net 4.

Primi passi

Create un nuovo progetto di tipo Windows Application, nel linguaggio di vostro gradimento.
Nella form, inserite un controllo di tipo picturebox, un richtextbox, quattro pulsanti  ed un controllo label, il tutto come riportato in figura 1.




Figura 1

Il controllo Richtextbox,  servirà per caricare il testo da un file di tipo “.rtf”.

Stesura di codice

Dopo  aver impostato le varie proprietà ai controlli, passiamo in visualizzazione codice, per scrivere il codice per la gestione della stampa.
Per la stampa, occorre inserire lo spazio dei nomi “printing” il quale contiene le classi per poter effettuare e gestire le stampe.
Qui di seguito si riporta il frammento di codice di tale dichiarazione.

VB.Net
Imports System.Drawing.Printing
C#
using System.Drawing.Printing;

Terminato ciò, scriviamo una variabile a livello di classe form, per gestire la stampa nei vari eventi click dei pulsanti.
Oltre a ciò, scriviamo anche una constante per il titolo delle messagebox.
Il codice riportato qui di seguito, va inserito dopo la dichiarazione della form.
VB.Net
'creo una variabile per gestire i dcumenti di stampa
    Private WithEvents pdocStampa As New PrintDocument()
    'costante per il titolo delle messagebox
    Const titolo As String = "Esempio Stampa"
C#
  //costante per il titolo delle messagebox
        const string titolo = "Esempio Stampa";
        //creo una variabile per gestire i dcumenti di stampa
        private PrintDocument pdocStampa = new PrintDocument();

Nell’evento load della  form, carichiamo il testo presente in un file rtf

VB.Net
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If (System.IO.File.Exists(Environment.CurrentDirectory & "\testo.rtf")) Then rtbTesto.LoadFile(Environment.CurrentDirectory & "\testo.rtf")
    End Sub
C#
private void Form1_Load(object sender, EventArgs e)
        {
            //gestore di evento dell'oggetto printdocument, per gestire lìevento printpage
            pdocStampa.PrintPage += new PrintPageEventHandler(pdocStampa_PrintPage);
            if (System.IO.File.Exists(Environment.CurrentDirectory + "\\testo.rtf"))
                rtbTesto.LoadFile(Environment.CurrentDirectory + "\\testo.rtf");
        }


L’evento printpage, ci permette di gestire la stampa, questo evento viene richiamato sia per l’anteprima di stampa che per la stampa.
Riportiamo qui di seguito il frammento di codice di tale evento

VB.Net
Private Sub pdocStampa_printpage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pdocStampa.PrintPage
        Dim ImgStampa As Image = pbxLogo.Image
        'imposto il carattere per la stampa ed anteprima
        Dim fntSTampa As New Font(Me.Font.FontFamily, 10, FontStyle.Regular)
        'imposto altezza
        Dim IntAltezza As Integer = e.MarginBounds.Top + 50
        'imposto l'immagine
        Dim RctImmagine As New Rectangle(e.MarginBounds.Left + 20, e.MarginBounds.Top - 30, 48, 48)
        'ottengo il carattere corrente
        Static IntCarattere As Integer
        Dim intCaratteriInseriti As Integer = 0
        Dim intLineeInserite As Integer = 0
        Dim Fmt As New StringFormat(StringFormatFlags.LineLimit)
        Try
            'disegno l'immagine
            e.Graphics.DrawImage(ImgStampa, RctImmagine)
            Dim intPrintAreaHeight, intPrintAreaWidth, intmarginLeft, intmarginTop As Int32
            'imposto le misure per la stampa
            With pdocStampa.DefaultPageSettings
                'imposto l'area di stampa
                intPrintAreaHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom
                intPrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right
                'imposto i margini
                intmarginLeft = .Margins.Left ' X coordinate
                intmarginTop = .Margins.Top + 30 ' Y coordinate
            End With
            'area di stampa
            Dim RctAreaDiStampa As New RectangleF(intmarginLeft, intmarginTop, intPrintAreaWidth, intPrintAreaHeight)
            'verifico che le stringa entri nell'area di stampa
            e.Graphics.MeasureString(Mid(rtbTesto.Text, IntCarattere + 1), fntSTampa, _
             New SizeF(intPrintAreaWidth, intPrintAreaHeight), Fmt, intCaratteriInseriti, intLineeInserite)
            e.Graphics.DrawString(Mid(rtbTesto.Text, IntCarattere + 1), fntSTampa, _
            Brushes.Black, RctAreaDiStampa, Fmt)
            'conto il carattere che sto inserendo
            IntCarattere += intCaratteriInseriti
            'verifico se devo inerire una pagina aggiuntiva
            If IntCarattere < rtbTesto.Text.Length Then
                e.HasMorePages = True
            Else
                e.HasMorePages = False
                'riporto a zero il contatore
                IntCarattere = 0
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
C#
  private void pdocStampa_PrintPage(object sender, PrintPageEventArgs e)
        {
            Image ImgStampa = pbxLogo.Image;
            //imposto il carattere per la stampa ed anteprima
            Font fntSTampa = new Font(this.Font.FontFamily, 10, FontStyle.Regular);
            //imposto altezza
            int IntAltezza = e.MarginBounds.Top + 50;
            //imposto le dimensione dell'immagine
            Rectangle RctImmagine = new Rectangle(e.MarginBounds.Left + 20, e.MarginBounds.Top - 30, 48, 48);
            //ottengo il carattere corrente
            int IntCarattere = 0;
            int intCaratteriInseriti = 0;
            int intLineeInserite = 0;
            StringFormat Fmt = new StringFormat(StringFormatFlags.LineLimit);
            try
            {
                //disegno l'immagine
                e.Graphics.DrawImage(ImgStampa, RctImmagine);
                int intPrintAreaHeight, intPrintAreaWidth, intmarginLeft, intmarginTop
 //imposto le misure per la stampa
                //imposto l'area di stampa
                intPrintAreaHeight = pdocStampa.DefaultPageSettings.PaperSize.Height - pdocStampa.DefaultPageSettings.Margins.Top - pdocStampa.DefaultPageSettings.Margins.Bottom;
                intPrintAreaWidth = pdocStampa.DefaultPageSettings.PaperSize.Width - pdocStampa.DefaultPageSettings.Margins.Left - pdocStampa.DefaultPageSettings.Margins.Right;
                //imposto i margini
                intmarginLeft = pdocStampa.DefaultPageSettings.Margins.Left; // X coordinate
                intmarginTop = pdocStampa.DefaultPageSettings.Margins.Top + 30; // Y coordinate
                //area di stampa
                RectangleF RctAreaDiStampa = new RectangleF(intmarginLeft, intmarginTop, intPrintAreaWidth, intPrintAreaHeight);
                //verifico che le stringa entri  nell'area di stampa
                e.Graphics.MeasureString(rtbTesto.Text, fntSTampa, new SizeF(intPrintAreaWidth, intPrintAreaHeight), Fmt, out intCaratteriInseriti, out intLineeInserite);
                e.Graphics.DrawString(rtbTesto.Text, fntSTampa, Brushes.Black, RctAreaDiStampa, Fmt);
                //conto il carattere che sto inserendo
                IntCarattere += intCaratteriInseriti;
                //verifico se devo inerire una pagina aggiuntiva
                if (IntCarattere < rtbTesto.Text.Length)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                    //riporto a zero il contatore
                    IntCarattere = 0;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



Facciamo doppio click sul pulsante che avrà il compito di visualizzare l’anteprima di stampa
Utilizzando un oggetto di tipo “PrintPreviewDialog” , tramite il metodo showdialog, verrà aperta una finestra di anteprima, dopo aver impostato le proprietà “Document”, con l’oggetto printdocument, e la proprietà “StartPosition” per indicare la posizione della finestra di anteprima.
Qui di seguito si riporta il frammento di codice.


VB.Net
Private Sub BtnAnteprima_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAnteprima.Click
        Dim ppdStampa As New PrintPreviewDialog()
        Try
            With ppdStampa
                .Document = pdocStampa
                .StartPosition = FormStartPosition.CenterScreen
                .ShowDialog()
            End With
        Catch ex As Exception
            MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
C#
private void BtnAnteprima_Click(object sender, EventArgs e)
        {
            PrintPreviewDialog ppdStampa = new PrintPreviewDialog();
            try
            {
                ppdStampa.Document = pdocStampa;
                ppdStampa.StartPosition = FormStartPosition.CenterScreen;
                ppdStampa.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



Passiamo ora al pulsante che avrà il compito di visualizzare la finestra delle opzioni di stampa.
Tramite la classe PageSetup, viene gestita la finestra per impostare le opzioni di stampa.
Qui di seguito si riporta un esempio di codice per l’evento click del pulsante opzioni.



VB.Net
Private Sub BtnOpzioni_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpzioni.Click
        'creo un oggetto di tipo finestra di opzioni di stampa
        Dim psdOpzioni As New PageSetupDialog()
        Try
            With psdOpziont
  .Document = pdocStampa
                .PageSettings = pdocStampa.DefaultPageSettings
            End With
            If psdOpzioni.ShowDialog = DialogResult.OK Then
                pdocStampa.DefaultPageSettings = psdOpzioni.PageSettings
End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Erro
  End Try
    End Sub
C#
private void BtnOpzioni_Click(object sender, EventArgs e)
        {
            //creo un oggetto di tipo finestra di opzioni di stampa
            PageSetupDialog psdOpzioni = new PageSetupDialog();
            try
            {
                psdOpzioni.Document = this.pdocStampa;
                psdOpzioni.PageSettings = this.pdocStampa.DefaultPageSettings;
                if (psdOpzioni.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    this.pdocStampa.DefaultPageSettings = psdOpzioni.PageSettings;
                }
 }
            catch (Exception ex)
            {
MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


A questo punto, siamo giunti alla conclusione dell’articolo, non ci resta che scrivere il codice per la stampa del documento, e quindi il codice relativo all’evento click
Tramite la classe “PrintDialog” possiamo gestire la stampa in ambito .Net, impostando la proprietà “Document” con l’oggetto della classe printDocument.
Qui di seguito si riporta il codice completo relativo all’evento click del pulsante per la stampa.

VB.Net
Private Sub btnFinestra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFinestra.Click
        'creo un oggetto di tipo finestra di dialogo di stampa
        Dim pdlgStampa As New PrintDialog()
        Try
            'toglie la finestra pop up
            pdocStampa.PrintController = New System.Drawing.Printing.StandardPrintController()
            pdlgStampa.Document = pdocStampa
            If pdlgStampa.ShowDialog = DialogResult.OK Then
                pdocStampa.Print()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Stampa", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
C#
  private void btnFinestra_Click(object sender, EventArgs e)
        {
            //creo un oggetto di tipo finestra di dialogo di stampa
            PrintDialog pdlgStampa = new PrintDialog();
            try
            {
                //toglie la finestra pop up
                this.pdocStampa.PrintController = new StandardPrintController();
                pdlgStampa.Document = pdocStampa;
                if (pdlgStampa.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    this.pdocStampa.Print();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

Conclusioni

L’articolo ha voluto fornire le conoscenze per gestire la stampa in ambiente windows Application, mostrando alcune delle classi per la stampa messa a disposizione dal Framework .Net 4.
Affrontando in maniera completa le tecniche più comuni, che ogni programmatore potrà affrontare durante lo sviluppo del software.
Tramite la parola download è possibile scaricare il file d’esempio. Nel prossimo articolo, vedremo come stampare una form, con i relativi controlli.


Download