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