Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Printpage con printpreviewdialog e testo giustificato
venerdì 27 febbraio 2009 - 22.54
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
ans66
Profilo
| Junior Member
62
messaggi | Data Invio:
ven 27 feb 2009 - 22:54
965_ProvaClasseStampa.zip
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
309
messaggi | Data Invio:
sab 28 feb 2009 - 11:44
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
62
messaggi | Data Invio:
sab 28 feb 2009 - 13:49
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
62
messaggi | Data Invio:
lun 2 mar 2009 - 00:00
972_ProvaClasseStampa.zip
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
Torna su
Stanze Forum
Elenco Threads
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 !