Newsgroup: it.comp.lang.visual-basic
Titolo: [HELP] Testo giustificato

Qualcuno sa come fare a giustifcare il testo a blocchetto?
Grazie


Col VB non si fa. Occorrono le API tipo SetTextAlign e ExtTextOut
ciao


;__; come si fa con le API? Non so utilizzarle...
Ciao


Che cosa intendi per blocchetto?
Ciao Bruno


Intendo il testo allineato sia a destra che a sinistra.... come quello del
word (l'icona che quando ci punti sopra ti scrive nella tool tipo
"Giustifica".
Ciao


Se vuoi ottenere quel risultato programmando in vb, buon lavoro. Non e'
facile, o meglio, e' una palla.
Come fare:
1) devi sapere quanto e' grande il foglio
2) Prendi il tuo bel testo ed estrai una parola (le parole sono separate da
spazzi, trovi il primo spazio e quindi la prima parola)
3) Controlli che ci stia nella pagina (usa Form/Printer/Picture
.TextWidth(parola$))
4) Se ci sta, estrai la prox parola dalla strina e la accodi temporaneamente
a quella gia estratta
5) Ripeti il punto 2 e 3 e 4 finche' la nuova parola non ci sta piu'. A
questo punto:
6) Rimetti l'ultima parola estratta nella stringa di testo
7) Conti quante parole hai estratto (o le conti mentre le estrai)
8) fai la differenza tra la dimensione del foglio e la lunghezza della
"frase" estratta (es: differenza=LenFoglio-.TextWidth(Frase$) )
9) fai: Surplus= differenza / (NrParole-1)
10) Stampi le parole Una alla Volta, con un .Print ""; (col punto e virgola
finale) e dopo ogni print, fai .CurrentX=.CurrentX+Surplus.
11) Riprendi dal punto 2
E' migliorabile, inquanto facendo cosi' c'e' un errore che si somma e che a
fine riga puo' contare quasi un pixel per parola.
Buon lavoro ( o meglio, lavoraccio  :-) )
Ciao
By -MES-   Maronese Ettore
http://ilmes.freeweb.org
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://members.xoom.com/it_lang_vb


Ti ringrazio per la spiegazione ^_^ Anche se non ci ho capito molto (sono
una principiante ^_^;;), cercherò di sfruttare al massimo queste info.
Ciao ^_^


Se usi sempre lo stesso font, il problema è di facile soluzione.
La giustificazione si attua aumentando la larghezza dello spazio. Questa
operazione viene effettuata dall'API SetTextJustification
Declare Function SetTextJustification Lib "gdi32" Alias
"SetTextJustification" (ByVal hdc As Long, ByVal nBreakExtra As Long, ByVal
nBreakCount As Long) As Long
Questa prende 3 valori, hdc = device context del controllo su cui stampi
   nBrekExtra 
n.ro
 di pixel che separano la lunghezza della tua riga dal
margine destro
   nBreakCount 
n.ro
 di spazi che sono presenti all'interno della tua riga
Per fare un esempio,
Supponiamo di dovere giustificare una riga del tipo "Pippo gioca di sera".
Inserisci una pictureBox in un form, e settane la proprietà scaleMode su
Pixel
a questo punto calcolati lo spazio extra
nBreakExtra = picture.scalewidth - picture1.TextWidth("Pippo gioca di sera")
nBreakCont = 3
hdc = picture1.hdc
Per scrivere
SetTextJustification hdc, nBreakExtra, nBreakCount
picture1.? "Pippo gioca di sera"
SetTextJustification hdc, 0,0
La seconda chiamata è necessaria per ripristinare la larghezza dello spazio
al suo valore originario.
Ricapitolando i passaggi generali per giustificare un paragrafo sono:
1) suddividi il paragrafo in righe
2) per ogni riga ti calcoli il 
n.ro
 di spazi e il 
n.ro
 di pixel extra
3) modifichi la larghezza della


Ciao.. grazie, però è troppo difficile ;__; cmq ci provo...


Guarda un po' te che cazzo mi metto a fare quando di mezzo c'e' una
ragazza....
Qui di seguito c'e' un esempio che fa quanto ho detto.
Fa a manina quello che gia fa l'API SetTextJustification().
Divertiti a ridimensionare il form e a vedere il testo correggersi in modo
da essere sempre
Private Sub Form_Load()
    Call Form_Resize
End Sub
Private Sub Form_Resize()
    Dim Testo$
    Testo = "Siamo qui, gia le quattro e.., siamo qui, finestrini socchiusi
su strade indifese dai nostri pesanti a capir. E cosi', anche il sabato e'
andato cosi', si e' bevuto ballato, qualcuno ha imbarcato il piu' scemo le
ha prese una faccia cosi'."
    Call StampaComeVuoleMeimi(Me, Testo)
End Sub
Sub StampaComeVuoleMeimi(out As Object, ByVal Scritta$)
    Dim Sx$, Riga$
    Dim LenRiga     As Single
    Dim XInizio     As Single
    Dim XLen        As Single
    Dim Incremento  As Single
    Dim NewX        As Single
    Dim NrParole%
    Dim C%
    Dim catStampa As Boolean
    XLen = out.ScaleWidth - (out.ScaleWidth / 100 * 20)
    XInizio = (out.ScaleWidth - XLen) / 2
    NrParole% = 0
    LenRiga = 0
    out.Cls
    Debug.Print "--" & XLen & "--"
    Do
        NrParole% = NrParole% + 1
        Sx$ = SpezzaStringa(Scritta$, " ")
        If out.TextWidth(Riga$ & Sx$ & " ") > XLen Or Len(Sx$) = 0 Then
            NrParole% = NrParole% - 1
            If Len(Riga$) = 0 Then
                out.Print Sx$   ' Una sola parola che non ci sta!?!
            Else
                Scritta$ = Sx$ & " " & Scritta$
                Incremento = 0
                If NrParole% > 1 Then Incremento = (XLen - LenRiga) /
(NrParole% - 1)
                Debug.Print out.TextWidth(Riga$); " ";
                NewX = XInizio
                For C = 1 To NrParole%
                    out.CurrentX = NewX
                    Sx$ = SpezzaStringa(Riga$, " ")
                    out.Print Sx$;
                    If Len(Riga$) = 0 Then Exit For
                    NewX = NewX + out.TextWidth(Sx$) + Incremento
                Next C
                Debug.Print NrParole% & " " & out.CurrentX - XInizio & " " &
Incremento
                out.Print ""  ' vado a capo
            End If
            If Len(Scritta$) = 0 Then Exit Do
            NrParole% = 0
            LenRiga = 0
        Else
            Riga$ = Riga$ & Sx$ & " "
            LenRiga = LenRiga + out.TextWidth(Sx$)
        End If
    Loop
End Sub
Function SpezzaStringa(S1$, S2$) As String
    Dim Pos%
    Pos% = InStr(S1$, S2$)
    If Pos% Then
        SpezzaStringa = Left$(S1$, Pos - 1)
        S1$ = Mid$(S1$, Pos + Len(S2$))
    Else
        SpezzaStringa = S1$
        S1$ = ""
    End If
End Function



Beh, gia' che l'hai fatto per il gentil sesso, potresti anche fiondarlo sul
Sito Comune ;-)

On Thu, 10 Dec 1998 17:00:33 +0100, "Meimi" <^_^@^_^.it> wrote:
  Siccome non hai un'e-mail valida, ti scrivo pubblicamente per
segnalarti che e' buona educazione riportare solo la parte del
messaggio a cui si risponde strettamente significativa ai fini della
risposta stessa e quotare tutto il messaggio per aggiungere solo una o
due righe e' considerato notevole maleducazione.
  Ti consiglio di leggere il manifesto del newsgroup (dovrebbe essere
stato inserito nel sito comune). Evito di postare la netiquette per
motivi di spazio.
  Ciao :-)
  Massimo
  Nell'indirizzo, inserire una "h" tra la "t" e la "u"
  In the address, insert an "h" between the "t" and the "u"


Ti ringrazio per le procedure.. ma non avresti dovuto disturbarti cosě..
scusami ;__;
Ciao

motivi di spazio.
OK... messaggio recepito.... se non mi volete tolgo il disturbo subito.
Ciao

Meimi <^_^@^_^.it> ha scritto nel messaggio

Guarda che non te la devi prendere cosi'...
Massimo ti ha solo spiegato come ci si comporta "educatamente" in un NG,
oltretutto il tono del suo msg non era per nulla offensivo.
E' come se ti incazzassi quando un professore ti spiega qualcosa di nuovo a
scuola, ti sembra corretto?
--
Roal Zanazzi
z...@iol.it


Eggià perché io non mi comporto educatamente... Lui non mi ha spiegato come
si ci comporta, ma è partito già dal presupposto che sono maleducata. Poi
andatevi a leggere tutti i messaggi, noterete che non sono solo io che
riporto tutto.. chissà perché l'avete fatto notare solo a me... mah..
mistero della vita.
Cmq, caro Roal, non è educato nemmeno prendere in giro la gente che sa meno
di te, ricordatelo.
Ciao

OK... messaggio recepito.... se non mi volete tolgo il disturbo subito.
  Hai capito proprio male: non so se ci sia qualcuno che,
individualmente, non ti vuole, ma in generale chiunque si inserisce in
un gruppo dovrebbe conoscere i modi corretti per averci a che fare e,
visto che tu sei nuova ed hai mostrato di non conoscerli, ti ho
avvisata del problema. Se cerchi sul sito comune o anche su Dejanews,
puoi leggere li manifesto del newsgroup e capire qual e' il miglior
modo per comunicare con noi.
  Se poi hai dei problemi con altri frequentatori abituali, ricorda
che qui c'e' gente che vive scrivendo programmi, percio' sentire
parlare di crack e simili come se fosse roba normale e' alquanto
sgradevole. Tra l'altro, sarebbe piuttosto incoerente per chi vive
programmando rubare il lavoro altrui (anche se ci sono pure
quelli...), percio' sarebbe preferibile che tu evitassi certi
discorsi, rimanendo fermo il fatto che sei comunque tu ad assumerti la
responsabilita' di cio' che scrivi.
  Concludendo, su questo newsgroup di solito la gente viene per
scambiarsi informazioni sul VB, ma il newsgroup perderebbe senso se
degenerasse nel caos e per questo ci siamo autoregolamentati: chiunque
partecipi per aggiungere qualcosa di positivo e' ben accetto,
altrimenti crediamo che sia lui/lei a perderci se se ne va.



Io ho portato molto di positivo -_- cioè la mia presenza.... ^___^
Cmq... farò come dici, hai vinto ;_;
Ciao Maxuccio

Cmq... farò come dici, hai vinto ;_;
  Brava, cosi' ti risparmi una predica in stile Scalfaro... ;-)))
  P.S. Hai visto che Roal ha ripostato il manifesto del newsgroup?



No e non mi interessa ^_^
Ciao


M A L E !    :-/
Ricordati che sei in una comunita', e devi rispettare tutti!
E ti prego, non rispondere, non aumentare ulteriormente la dimensione di
questo therad, un thread assolutamente infruttuoso, futile, inutile a tutti
(se non a te).


Sito Comune ;-)
Fatto, ora c'e' un esempio anche sul sito.


No e non mi interessa ^_^
  Guarda che parte la predica... ;-)))
  P.S. Mi pare che ci siamo spiegati a sufficienza o almeno lo spero e
non vorrei tirare avanti un thread che sta finendo OT, quindi se hai
altre domande va bene, altrimenti io la chiuderei qui e andiamo avanti
con i thread in topic, che ne dici?



OK ^_^