giovedì 2 giugno 2011

Stampare i controlli in .Net 4 tramite VB.Net e C#

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_la-stampa-dei-controlli-in-vbnet-e-c_1049.aspx





Introduzione




Continua la serie di articoli dedicati all’utilizzo della stampa in .Net 4, tramite i linguaggi di programmazione VB.Net e C#. In questo articolo, vedremo come stampare in una form, i controlli presenti nella finestra.
Dopo aver creato un nuovo progetto di tipo “Windows Application” inseriamo nella form, un controllo groupbox, due pulsanti, due controlli label, due controlli caselle di testo e tre controlli di tipo checkbox.
Il tutto come mostrato in figura 1






Figura 1





Terminata la parte di disegno della nostra finestra, passiamo in visualizzazione codice.
Inseriamo lo spazio dei nomi per la stampa, il tutto come mostrato qui di seguito.



VB.Net



Imports System.Drawing.Printing





C#



using System.Drawing.Printing;





Dopo la dichiarazione di form, scriviamo le variabili oggetto per gestire la stampa.
Qui di seguito si riportano i codice per entrambi i linguaggi.




Qui di seguito si riportano i codice per entrambi i linguaggi



VB.Net



'variabile per la gestione del documento di stampa



Private WithEvents m_pdcStampa As New PrintDocument()



'variabile per l'anteprima



Private m_ppdAnteprima As New PrintPreviewDialog()



'variabile per la gestine delle distanze dei controlli



Dim IntLeft As Integer = 150



Dim IntTop As Integer = 50





C#



//variabile per la gestione del documento di stampa



PrintDocument m_pdcStampa = new PrintDocument();





//variabile per l'anteprima



PrintPreviewDialog m_ppdAnteprima = new PrintPreviewDialog();



//variabile per la gestine delle distanze dei controlli



int IntLeft = 150;



int IntTop = 50;







A differenza del linguaggio VB.Net, per l’esempio C#. nell’evento load della form, scriviamo il codice per la gestione dell’evento printpage.
Il tutto come mostrato qui di seguito.




C#



private void Form1_Load(object sender, EventArgs e)



{



m_pdcStampa.PrintPage += new PrintPageEventHandler(m_pdcStampa_PrintPage);



}







Terminata la stesura di codice, scriviamo il codice per gestire la stampa dei controlli. La funzione preposta qui di seguito, illustra una tecnica che predispone la stampa e l’anteprima di stampa, riguardante la form con i relativi controlli.



VB.Net



Private Sub StampaControllo(ByVal BlnCheckbox As Boolean, ByVal blnDisegnaBordo As Boolean, ByVal ClrColoreBordo As Color, _



ByVal IntTopControllo As Integer, ByVal IntLeftControllo As Integer, ByVal CtrControllo As Control, ByVal grp As Graphics, _



ByVal Allienamento As StringAlignment)





Dim PenBordo As New Pen(ClrColoreBordo)





'dimensione



Dim Rect As New RectangleF(CtrControllo.Left + IntLeftControllo, CtrControllo.Top + IntTopControllo, CtrControllo.Width, CtrControllo.Height)





'verifica se deve disegnare il bordo



If blnDisegnaBordo Then



grp.DrawRectangle(PenBordo, Rect.Left, Rect.Top, CtrControllo.Width, CtrControllo.Height)



End If





'qualora la è true il blncheckbox è una check faccio altre operazioni



If BlnCheckbox = True Then



'misure per margine top e sinistro



Dim intTopCheckBox As Integer = Rect.Top + (Rect.Height / 2) - 5



Dim IntLeftCheckbox As Integer = Rect.Left + 5



Dim chkMioCheckbox As CheckBox = CType(CtrControllo, CheckBox)



grp.DrawRectangle(PenBordo, IntLeftCheckbox, intTopCheckBox, 10, 10)



If chkMioCheckbox.CheckState = CheckState.Checked Then



grp.FillRectangle(New SolidBrush(Color.Blue), IntLeftCheckbox + 2, intTopCheckBox + 2, 6, 6)



End If



'disegno il testo



grp.DrawString(CtrControllo.Text, Me.Font, New SolidBrush(Color.Black), Rect.Left + 18, Rect.Top)





Else



'allienamento del testo



Dim fm As New StringFormat(StringFormatFlags.LineLimit)



fm.Alignment = Allienamento



'disegno il testo



grp.DrawString(CtrControllo.Text, Me.Font, New SolidBrush(Color.Black), Rect, fm)



End If



'rilascia la memoria



PenBordo.Dispose()



End Sub





C#



private void StampaControllo(bool BlnCheckbox, bool blnDisegnaBordo, Color ClrColoreBordo, int IntTopControllo, int IntLeftControllo, Control CtrControllo, Graphics grp, StringAlignment Allienamento)



{





Pen PenBordo = new Pen(ClrColoreBordo);





//dimensione



RectangleF Rect = new RectangleF(CtrControllo.Left + IntLeftControllo, CtrControllo.Top + IntTopControllo, CtrControllo.Width, CtrControllo.Height);





//verifica se deve disegnare il bordo



if (blnDisegnaBordo)



grp.DrawRectangle(PenBordo, Rect.Left, Rect.Top, CtrControllo.Width, CtrControllo.Height);





//qualora la è true il blncheckbox è una check faccio altre operazioni



if (BlnCheckbox == true)



{



//misure per margine top e sinistro



int intTopCheckBox = Convert.ToInt32((Rect.Top + (Rect.Height / 2) - 5));



int IntLeftCheckbox = Convert.ToInt32((Rect.Left + 5));



CheckBox chkMioCheckbox = (CheckBox)CtrControllo;





grp.DrawRectangle(PenBordo, IntLeftCheckbox, intTopCheckBox, 10, 10);



if (chkMioCheckbox.CheckState == CheckState.Checked)



grp.FillRectangle(new SolidBrush(Color.Blue), IntLeftCheckbox + 2, intTopCheckBox + 2, 6, 6);



//disegno il testo



grp.DrawString(CtrControllo.Text, this.Font, new SolidBrush(Color.Black), Rect.Left + 18, Rect.Top);



}



else



{



//allienamento del testo



StringFormat fm = new StringFormat(StringFormatFlags.LineLimit);



fm.Alignment = Allienamento;



//disegno il testo



grp.DrawString(CtrControllo.Text, this.Font, new SolidBrush(Color.Black), Rect, fm);



}



//rilascia la memoria



PenBordo.Dispose();



}





Ora scriviamo la funzione che permette di rilevare tutti i controlli presenti nella form. La funzione richiama quella precedente, per ogni controllo trovato.
Per i controlli contenitori, per esempio Groupbox, viene fatto un ciclo recursivo permettendo in questo modo di rilevare i controlli al suo interno.
Qui di seguito si riporta il codice.




VB.Net



'Funzione per ricercare i controlli nel form



Private Sub TrovaControlli(ByVal Grp As Graphics, ByVal CtrForm As Control)



Dim CtrControlli As Control



Dim IntTopIniziale As Integer = IntTop



Dim intLefIniziale As Integer = IntLeft





'verifico che non sia una form



If Not (TypeOf CtrForm Is Form) Then



IntTopIniziale = CtrForm.Top + IntTop



intLefIniziale = CtrForm.Left + IntLeft



End If





'ciclo per tutti i controlli



For Each CtrControlli In CtrForm.Controls



If TypeOf CtrControlli Is CheckBox Then



StampaControllo(True, False, Color.LightGray, IntTopIniziale, intLefIniziale, CtrControlli, Grp, StringAlignment.Near)



'funzione se è un checkbox



ElseIf TypeOf CtrControlli Is GroupBox Then



StampaControllo(False, True, Color.LightGray, IntTopIniziale, intLefIniziale, CtrControlli, Grp, StringAlignment.Near)



TrovaControlli(Grp, CtrControlli)



Else



StampaControllo(False, True, Color.LightGray, IntTopIniziale, intLefIniziale, CtrControlli, Grp, StringAlignment.Near)





'funzione se non è di checkbox



End If





Next



End Sub







C#



//Funzione per ricercare i controlli nella form



private void TrovaControlli(Graphics Grp, Control CtrForm)



{





//Control CtrControlli;



int IntTopIniziale = IntTop;



int intLefIniziale = IntLeft;



//verifico che non sia una form



if (!(CtrForm is Form))



{



IntTopIniziale = CtrForm.Top + IntTop;



intLefIniziale = CtrForm.Left + IntLeft;



}



//ciclo per tutti i controlli



foreach (Control CtrControlli in CtrForm.Controls)



{



if (CtrControlli is CheckBox)



StampaControllo(true, false, Color.LightGray, IntTopIniziale, intLefIniziale, CtrControlli, Grp, StringAlignment.Near);



else if (CtrControlli is GroupBox)



{



StampaControllo(false, true, Color.LightGray, IntTopIniziale, intLefIniziale, CtrControlli, Grp, StringAlignment.Near);



TrovaControlli(Grp, CtrControlli);





}



else



StampaControllo(false, true, Color.LightGray, IntTopIniziale, intLefIniziale, CtrControlli, Grp, StringAlignment.Near);





}





}





Scriviamo il codice per il gestore di evento “PrintPage” della classe “Prindocument” permettendo in questo modo di eseguire la funzione “TrovaControlli” per predisporre la stampa.




VB.Net



Private Sub m_pdcStampa_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles m_pdcStampa.PrintPage



TrovaControlli(e.Graphics, Me)



e.Graphics.DrawRectangle(Pens.Green, IntLeft, IntTop, Width, Height)



e.Graphics.FillRectangle(New SolidBrush(SystemColors.ActiveCaption), IntLeft, IntTop, Width, 10)



e.HasMorePages = False



End Sub







C#



private void m_pdcStampa_PrintPage(object sender, PrintPageEventArgs e)



{



TrovaControlli(e.Graphics, this);



e.Graphics.DrawRectangle(Pens.Green, IntLeft, IntTop, Width, Height);



e.Graphics.FillRectangle(new SolidBrush(SystemColors.ActiveCaption), IntLeft, IntTop, Width, 10);



e.HasMorePages = false;



}







Siamo giunti alla conclusione del codice, ora non resta che scrivere il codice riguardante l’evento click del pulsante di stampa.
In questo evento, scriveremo il codice riguardante l’impostazione di stampa, come dimensini, posizione della finestra, ed altro ancora.







VB.Net



Private Sub btnStampa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStampa.Click



With ppdAnteprima



.Width = 640



.Height = 480



'toglie la popup



m_pdcStampa.PrintController = New System.Drawing.Printing.StandardPrintController()



.Document = m_pdcStampa



.StartPosition = FormStartPosition.CenterScreen



.ShowDialog(Me)



End With



End Sub





C#



private void btnStampa_Click(object sender, EventArgs e)



{



ppdAnteprima.Width = 640;



ppdAnteprima.Height = 480;



//toglie la popup



m_pdcStampa.PrintController = new StandardPrintController();



ppdAnteprima.Document = m_pdcStampa;



ppdAnteprima.StartPosition = FormStartPosition.CenterScreen;



ppdAnteprima.ShowDialog(this);



}









Conclusioni



L’articolo ha voluto fornire al lettore una tecnica di come stampare una form con i relativi controlli.
Nel prossimo ed ultimo articolo, vedremo la stampa di un controllo GridView.
Tramite la parola Download è possibile scaricare il file d’esempio utilizzato in questo articolo.
Download


Nessun commento: