Printpage con printpreviewdialog e testo giustificato

venerdì 27 febbraio 2009 - 22.54

ans66 Profilo | Junior Member

Sto cercando di creare una classe che integra printpage e printpreviewdialog con diverse funzioni. Fra queste ho inserito due funzioni TestoGiustSu1Col e GiustTst che dovrebbero provvedere all'inserimento di un testo stampato in maniera giustificata e RestitMaxPagine che serve per restituire il numero delle pagine dopo aver calcolato il numero di righe per pagina. Putroppo il testo non viene stampato a dovere. Accetto davvero qualsiasi consiglio mi possa aiutare.

Allego classe MiaStampa e classe ProvaStampa

ilario Profilo | Senior Member

ciao

prova a vedere se va bene

Public Function StampaTestoMultiriga(ByVal Testo As String, ByVal LarghezzaRettangolo As Integer, ByVal Carattere As Font, ByVal Colore As SolidBrush, ByVal Allineamento As StringFormat, ByVal PosizioneX As Integer, ByVal PosizioneY As Integer, ByVal e As System.Drawing.Printing.PrintPageEventArgs) As Integer

Dim split_string() As String = Testo.Split(" ")

'Misuro la lunghezza della stringa da stampare
Dim string_size As SizeF = e.Graphics.MeasureString(Testo, Carattere)



'Verifico che non ci siano parole più lunghe della larghezza del rettangolo.
'In caso affermativo aggiungo una linea
Dim count As Integer = 0
For i As Integer = 0 To split_string.GetUpperBound(0)
Dim string_size_split As SizeF = e.Graphics.MeasureString(split_string(i), Carattere)
If string_size_split.Width > LarghezzaRettangolo Then
count += 1
End If
Next

'Calcolo l'altezza del rettangolo
'Dividendo la lunghezza della stringa per la larghezza del rettangolo in pratica ottengo il numero di righe
Dim numLine As Integer = Math.Ceiling((string_size.Width / LarghezzaRettangolo)) + count

'Moltiplico il numero di linee per l'altezza del carattere
Dim AltezzaRettangolo As Integer = numLine * Carattere.Height

'crea il rettangolo di stampa
Dim rettangolo As New RectangleF(PosizioneX, PosizioneY, LarghezzaRettangolo, AltezzaRettangolo)


'stampa il testo
e.Graphics.DrawString(Testo, Carattere, Colore, rettangolo, Allineamento)



Return numLine

End Function

ciao
ilario

ans66 Profilo | Junior Member

Grazie tanto per la Funzione. Sto pensando a come inserirla con PrintDocument_PrintPage dove dopo un numero di righe devo prevedere il salto pagina. Un'altra domanda: come ottenere l'allineamento giustificato nel rettangolo?
Sto pensando di modificare la tua funzione in modo che stampi su printpage il numero massimo di righe nella pagina (altezza rettangolo) ma deve restituire un testo nel quale venga tolto tutto quello che e` gia` stato stampato....penso sia questa la strada giusta. Cosa ne pensi? Ho elaborato qualche cosa ma non funziona correttamente...spero sia comunque d'aiuto per farti capire cosa vorrei fare:


Private Function StampaTestoMultiriga(ByVal Testo As String, ByVal LarghezzaRettangolo _
As Integer, ByVal Carattere As Font, ByVal Colore _
As SolidBrush, ByVal Allineamento As StringFormat, _
ByVal PosizioneX As Integer, ByVal PosizioneY As _
Integer, ByVal e As System.Drawing.Printing. _
PrintPageEventArgs, ByVal NrMaxRgInPagina As Integer) _
As String


Dim builderDaRiempire As New System.Text.StringBuilder
Dim builderDaSvuotare As New System.Text.StringBuilder
Dim builderControllo As New System.Text.StringBuilder

Static dentro As Integer = 0

If dentro = 0 Then
'Tolgo via spazi, a capo, Tab
Testo = Testo.Replace(Chr(10), "")
Testo = Testo.Replace(Chr(13), Space(1))
Testo = Testo.Replace(Chr(9), Space(1)) 'chr(9) TAB
Testo = Testo.Replace(Space(2), Space(1))
Testo = Testo.Replace(",", ", ")
End If

builderDaSvuotare.Append(Testo)


Dim split_string() As String = Testo.Split(" ")

'Misuro la lunghezza della stringa da stampare
Dim string_size As SizeF = e.Graphics.MeasureString(Testo, Carattere)


'vedo se ci sono piu` righe di quelle che possono essere contenute in una pagina
Dim count As Integer = 0
For i As Integer = 0 To split_string.GetUpperBound(0) - 1
Dim lungParolaPiuSpazio As Integer = (split_string(i) & Space(1)).Length

builderControllo.Append(split_string(i) & Space(1))
Dim string_size_split As SizeF = e.Graphics.MeasureString(builderControllo.ToString, Carattere)


If string_size_split.Width > LarghezzaRettangolo Then
builderControllo = New System.Text.StringBuilder
builderControllo.Append(split_string(i) & Space(1))
count += 1
If count > NrMaxRgInPagina Then
Exit For
Else
builderDaRiempire.Append(split_string(i) & Space(1))
builderDaSvuotare.Remove(0, lungParolaPiuSpazio)
End If
Else
builderDaRiempire.Append(split_string(i) & Space(1))
builderDaSvuotare.Remove(0, lungParolaPiuSpazio)
End If
Next

'Calcolo l'altezza del rettangolo
'Dividendo la lunghezza della stringa per la larghezza del rettangolo in pratica ottengo il numero di righe
Dim numLine As Integer = Math.Ceiling((string_size.Width / LarghezzaRettangolo))+2

'Divido numero Linee per Numero Massimo Righe in una pagina
Dim PagineNr As Integer = numLine \ NrMaxRgInPagina

'C'e` un resto
Dim Resto As Integer = numLine Mod NrMaxRgInPagina
If Resto <> 0 Then PagineNr += 1

If dentro = 0 Then
NrPagDaFunct = PagineNr
dentro += 1
End If

'Una o piu` pagine: se piu` pagine il numero di linee diventa il numero max righe in Pag
If PagineNr > 1 Then numLine = NrMaxRgInPagina + 1


'Moltiplico il numero di linee per l'altezza del carattere
Dim AltezzaRettangolo As Integer = numLine * Carattere.Height

'crea il rettangolo di stampa
Dim rettangolo As New RectangleF(PosizioneX, PosizioneY, LarghezzaRettangolo, AltezzaRettangolo)


'stampa il testo
e.Graphics.DrawString(builderDaRiempire.ToString, Carattere, Colore, rettangolo, Allineamento)

Return builderDaSvuotare.ToString
MessageBox.Show(builderDaSvuotare.ToString)

End Function


Private Sub PrintDocument_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument.PrintPage
Dim Fn As New System.Drawing.Font(InsTit.TipoFont, InsTit.GrandezzaFont, _
InsTit.StileFont)
Dim PosY As Single

'Titolo
If InsTit.Cetitolo = True Then
e.Graphics.DrawString(InsTit.Titolo, Fn, InsTit.Colore, InsTit.x, InsTit.y)
PosY = InsTit.y
End If

'Immagine
If insImm.ceimmagine = True Then
e.Graphics.DrawImage(Image.FromFile(insImm.DirImmagine), insImm.x, insImm.y, _
insImm.Largh, insImm.Altez)
PosY = insImm.y
End If

Dim PosX As Integer = 30
PosY += 200
Dim PosYPerTitoli As Single = 0
Dim ControllaPagine As Boolean = True
Dim MaxPagine As Integer = 0
Static PagineStampate As Integer = 0
Static RigheStampate As Integer = 0
Dim Fnt As New Font(InsCorpo.Tst, InsCorpo.GrandezzaFont, InsCorpo.StileFont)
Dim NrRigheInPagina As Integer = ((e.MarginBounds.Height - PosY) / Fnt.Height) - 1

Dim Testo As String = String.Empty
Static TestoRestituito As String = String.Empty

Static dentro As Integer = 0
If dentro = 0 Then
Testo = InsCorpo.Tst
dentro += 1
Else
Testo = TestoRestituito
End If


Dim LargRiga As Integer = e.PageBounds.Width - 30 - 30
Dim Allin As System.Drawing.StringFormat

Allin = New System.Drawing.StringFormat(StringFormatFlags.DirectionRightToLeft)
TestoRestituito = StampaTestoMultiriga(Testo, LargRiga, Fnt, _
New System.Drawing.SolidBrush(Color.Black), _
Allin, PosX, PosY, e, NrRigheInPagina)
MaxPagine = NrPagDaFunct

If ControllaPagine Then
'Incrementea il contatore delle pagine stampate
PagineStampate += 1

'Controlla se ci sono altre pagine da stampare...
If PagineStampate < MaxPagine Then
'Ci sono altre pagine
e.HasMorePages = True
Else
'Fine delle pagine
e.HasMorePages = False

End If
End If

ans66 Profilo | Junior Member

Ilario,

Penso di essere arrivato in fondo al problema: la mia classe sembra funzionare a dovere e l'allineamento giustificato mi soddisfa. Allego sia la classe MiaStampa e ProvaStampa nella speranza che qualcuno la possa testare ed eventualmente sono pronto a considerare consigli e modifiche. A disposizione per chiunque voglia approfondire la cosa
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5