codice:
Option Explicit On
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Drawing.Text
Public Class frmStampaP
Dim LoadInCorso As Boolean
Dim NuovaChiamata As Boolean
Private Sub frmStampaP_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim I As Integer, J As Integer, Printer As String
On Error GoTo G_Err
LoadInCorso = True
'carico la combo con le stampanti installate
cboStampanti.Items.Clear()
For Each Printer In System.Drawing.Printing.PrinterSettings.InstalledPrinters
cboStampanti.Items.Add(Printer)
Next
If cboStampanti.Items.Count > 0 Then
cboStampanti.SelectedIndex = 0
Call Imposta_stampante()
End If
'carico la combobox dei font disponibili nel sistema
cboFont.Items.Clear()
I = 0 : J = 0
Dim MyFonts As New InstalledFontCollection
For Each one As FontFamily In MyFonts.Families
cboFont.Items.Add(one.Name)
I = I + 1
If LCase(one.Name) = "courier new" Then J = I - 1
Next
cboFont.SelectedIndex = J
'carico la combo per la dimensione del font
cboSize.Items.Clear()
For I = 10 To 40 Step 2
cboSize.Items.Add(I.ToString)
Next I
cboSize.SelectedIndex = 0
LoadInCorso = False
NuovaChiamata = True 'uso questa variabile per la ricorsione della routine PrintDocument1_PrintPage1
Exit Sub
G_Err:
StrMSG = MsgBox(Err.Description, vbExclamation, Me.Text)
End Sub
Private Sub Imposta_Stampante()
On Error GoTo G_Err
Dim Stampanti_installate = PrinterSettings.InstalledPrinters()
Dim objPD As New PrintDocument()
'seleziono la stampante attiva nella combobox
objPD.PrinterSettings.PrinterName = Stampanti_installate(cboStampanti.SelectedIndex)
Exit Sub
G_Err:
StrMSG = MsgBox(Err.Description, vbExclamation, Me.Text)
End Sub
Private Sub cboStampanti_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboStampanti.SelectedIndexChanged
If Not LoadInCorso Then
Call Imposta_Stampante()
End If
End Sub
Private Function LimitaTesto(CAMP As String, QUANTO As Integer) As String
If Len(CAMP) > QUANTO Then
LimitaTesto = Mid(CAMP, 1, QUANTO - 1) & "*"
Else
LimitaTesto = CAMP
End If
End Function
Private Sub cmdAnteprima_Click(sender As Object, e As EventArgs) Handles cmdAnteprima.Click
NuovaChiamata = True 'uso questa variabile per la ricorsione della routine PrintDocument1_PrintPage1
PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.ShowDialog()
End Sub
Private Sub cmdImpostazioni_Click(sender As Object, e As EventArgs) Handles cmdImpostazioni.Click
NuovaChiamata = True 'uso questa variabile per la ricorsione della routine PrintDocument1_PrintPage1
PageSetupDialog1.Document = PrintDocument1
If PageSetupDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
PrintDocument1.DefaultPageSettings = PageSetupDialog1.PageSettings
End If
End Sub
Private Sub cmdSta_Click(sender As Object, e As EventArgs) Handles cmdSta.Click
On Error GoTo G_Err
If cboStampanti.Items.Count > 0 Then
NuovaChiamata = True 'uso questa variabile per la ricorsione della routine PrintDocument1_PrintPage1
If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
PrintDocument1.Print()
StrMSG = MsgBox("I dati sono stati inviati alla stampante.", vbInformation, Me.Text)
Else
StrMSG = MsgBox("Stampa annullata dall'utente.", vbInformation, Me.Text)
End If
Else
StrMSG = MsgBox("Nessuna stampante disponibile.", vbInformation, Me.Text)
End If
cboStampanti.Focus()
Exit Sub
G_Err:
StrMSG = MsgBox(Err.Description, vbExclamation, Me.Text)
End Sub
Private Sub PrintDocument1_PrintPage1(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim W As Integer, Rig As String, LineePerPagina As Integer, YRigaFoglio As Integer, strRigaStampa As String
Dim FontCorpo As New Font(cboFont.Text, CSng(cboSize.Text), FontStyle.Regular)
Dim FontTitolo As New Font(cboFont.Text, 16, FontStyle.Bold)
Dim FontPiePagina As New Font(cboFont.Text, 10, FontStyle.Regular)
Static RigaPerStampa As Integer 'variabile tipo static
Static Pagina As Integer 'variabile tipo static
YRigaFoglio = 100
If NuovaChiamata = True Then
NuovaChiamata = False 'uso questa variabile per la ricorsione della routine PrintDocument1_PrintPage1
RigaPerStampa = 0
Pagina = 0
End If
'calcolo il numero di linee per pagina e tolgo alcune righe per il pie di pagina
LineePerPagina = Math.Round(e.MarginBounds.Height / FontCorpo.GetHeight(e.Graphics)) - 5
'intestazione di pagina
e.Graphics.DrawString("RUBRICA", FontTitolo, Brushes.Black, 250, 50)
e.Graphics.DrawLine(Pens.Red, 50, 75, 750, 75)
e.Graphics.DrawString("NOMINATIVO", FontTitolo, Brushes.Black, 50, 80)
e.Graphics.DrawString("TELEFONI", FontTitolo, Brushes.Black, 350, 80)
'corpo della pagina
For RigaPerStampa = RigaPerStampa To RigaPerStampa + LineePerPagina
If RigaPerStampa < (frmMod_Eli.lstwNomi.Items.Count - 1) Then
'prendo alcuni caratteri del nominativo, altrimenti nel foglio non basta lo spazio
strRigaStampa = LimitaTesto(frmMod_Eli.lstwNomi.Items(RigaPerStampa).SubItems(1).Text, CInt(txtMaxNom.Text))
e.Graphics.DrawString(strRigaStampa, FontCorpo, Brushes.Black, 50, YRigaFoglio)
Rig = ""
For W = 2 To 22
Rig = Rig & frmMod_Eli.lstwNomi.Items(RigaPerStampa).SubItems(W).Text & IIf(Trim(frmMod_Eli.lstwNomi.Items(RigaPerStampa).SubItems(W).Text) <> "", " ", "")
Next W
'prendo alcuni caratteri della stringa con campi restanti, altrimenti nel foglio non basta lo spazio
If e.PageSettings.Landscape = True Then
strRigaStampa = LimitaTesto(Rig, CInt(txtMaxTelORIZ.Text)) 'pagina orientamento orizzontale
Else
strRigaStampa = LimitaTesto(Rig, CInt(txtMaxTelVERT.Text)) 'pagina orientamento verticale
End If
e.Graphics.DrawString(strRigaStampa, FontCorpo, Brushes.Black, 350, YRigaFoglio)
YRigaFoglio = YRigaFoglio + FontCorpo.GetHeight
e.HasMorePages = True
Else
e.HasMorePages = False
End If
Next RigaPerStampa
'separatore di pagina
If RigaPerStampa > (frmMod_Eli.lstwNomi.Items.Count - 1) Then
e.Graphics.DrawLine(Pens.Black, 550, (YRigaFoglio + 10), 750, (YRigaFoglio + 10))
End If
'pie di pagina
e.Graphics.DrawLine(Pens.Red, 50, (YRigaFoglio + 20), 750, (YRigaFoglio + 20))
Pagina += 1
e.Graphics.DrawString("Pagina " & Pagina, FontPiePagina, Brushes.Black, 600, (YRigaFoglio + 30))
End Sub
End Class