domenica 22 maggio 2011

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

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_la-stampa-in-microsoft-net-4-vbnet-e-c_1048.aspx





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 psdOpzioni





.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.Error)





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


2 commenti:

vale ha detto...

molto interessante, grazie...mi hai salvato :)

Emanuele ha detto...

Ciao Vale,
è stato un piacere.
Ciao Emaneule