Newsgroup: it.comp.lang.visual-basic
Titolo: Giustifare testo nel Rich Text Box

Ciao
Vorei giustificare il testo all'interno di un Rich Text Box , sia a destra
che a sinistra contemporaneamente per poter allineare i margini e creare
cosi delle lettere ordianate.
Come si puo' fare ?
Sarebbe interessante trovare un algoritmo a cui passare la stringa RTF per
generane una nuova giustificata.
Grazie

l'RTF standard non supporta l'allineamento a 'pacchetto'
-> GbC
http://www.gbcweb.com
F53C7B7263B8B09CCFE6AEBEFD97168F58B0C450

 l'RTF standard non supporta l'allineamento a 'pacchetto'
Ne stavamo parlando qualche tempo fa anche con Roby Piazzolla.
http://groups.google.com/groups?hl=it&lr=&ie=UTF8&oe=UTF8&selm=acrhu9%243e68%241%40stargate1.inet.it
riassumendo, dipende dalla versione di un paio di DLL.
Una volta che le DLL sono giuste (la nuova riched20 può essere
legalmente ottenuta installando l'MSI), bisogna attivare il tutto
con un paio di API. Una cosa carina è che dopo attivata almeno
una volta, funziona anche con il solo tag RTF (mi pare sia \gt).
Segue il codice semplificato, copiato da... ohibò, forse
Morcillo, o forse vbAccelerator, sono su un'altra macchina :-):
' **********DICHIARAZIONI***********
Private Const WM_USER = &H400
Private Const EM_EXSETSEL = (WM_USER + 55)
Private Const EM_SETSEL = &HB1
Private Const EM_GETSEL = &HB0
Private Const EM_GETPARAFORMAT = (WM_USER + 61)
Private Const EM_SETPARAFORMAT = (WM_USER + 71)
Private Const EM_GETSELTEXT = (WM_USER + 62)
Private Const EM_SETTYPOGRAPHYOPTIONS = (WM_USER + 202)
Private Const EM_GETTYPOGRAPHYOPTIONS = (WM_USER + 203)
Private Const TO_ADVANCEDTYPOGRAPHY = &H1
Private Const TO_SIMPLELINEBREAK = &H2&
Private Const PFM_ALIGNMENT = &H8
Private Const PFM_TABSTOPS = &H10
Private Const PFM_STYLE = &H400
Private Const PFA_LEFT = 1
Private Const PFA_RIGHT = 2
Private Const PFA_CENTER = 3
Private Const PFA_JUSTIFY = &H4
Private Const PS_SOLID = 0
Private Const PFA_FULL_GLYPHS = 7
Private Const mZERO = &H0&
Private Declare Function SendMessageLong Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
#If UNICODE Then
    Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageW" (ByVal hwnd As Long, ByVal uMgs As Long, _
ByVal wParam As Long, lParam As Any) As Long
#Else
    Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal uMgs As Long, _
ByVal wParam As Long, lParam As Any) As Long
#End If
Private Type Charrange
    cpMin As Long
    cpMax As Long
End Type
Private Type PARAFORMAT2
    cbsize As Integer
    dwpad As Integer
    dwMask As Long
    wNumbering As Integer
    wReserved As Integer
    dxStartIndent As Long
    dxRightIndent As Long
    dxOffset As Long
    wAlignment As Integer
    cTabCount As Integer
    lTabstops(0 To 31&) As Long
    dySpaceBefore As Long
    dySpaceAfter As Long
    dyLineSpacing As Long
    sStyle As Integer
    bLineSpacingRule As Byte
    bOutlineLevel As Byte
    wShadingWeight As Integer
    wShadingStyle As Integer
    wNumberingStart As Integer
    wNumberingStyle As Integer
    wNumberingTab As Integer
    wBorderSpace As Integer
    wBorderWidth As Integer
    wBorders As Integer
End Type
' **********FINE DICHIARAZIONI***********
'**********INIZIO ROUTINE**********
Public Sub GiustificaRTB(Scatola As RichTextBox, intStart As Integer, intEnd As Integer)
    Dim hWndr As Long
    hWndr = Scatola.hwnd
    Dim myparaf As PARAFORMAT2
    Dim cr As Charrange
    Dim lngRet As Long
    myparaf.cbsize = Len(myparaf)
    '   selezione del punto di inizio e di fine del testo da giustificare
    ' (comunque vale per tutto il paragrafo)
    cr.cpMax = intEnd
    cr.cpMin = intStart
' tenta di attivare la funzione per controllare la versione
    lngRet = SendMessageLong(hWndr, EM_SETTYPOGRAPHYOPTIONS, _
TO_ADVANCEDTYPOGRAPHY, TO_ADVANCEDTYPOGRAPHY)
    If lngRet = 1 Then    'funziona solo con la versione >= 3.0
        lngRet = SendMessageLong(hWndr, EM_GETTYPOGRAPHYOPTIONS, mZERO, mZERO)
        lngRet = SendMessage(hWndr, EM_GETPARAFORMAT, mZERO, myparaf)
        myparaf.dwMask = PFM_ALIGNMENT
        myparaf.wAlignment = PFA_JUSTIFY
        lngRet = SendMessage(hWndr, EM_SETPARAFORMAT, mZERO, myparaf)
    Else
        Debug.Print "Versione non corretta di DLL", lngRet
    End If
End Sub
'**********FINE ROUTINE**********
E la chiami così:
    GiustificaRTB rtbBox, rtbBox.SelStart, rtbBox.SelLength
Bye, G.

 con un paio di API.
A proposito, potrebbe essere utile anche questa funzione
per zoomare la RTB (in pratica, riduce o ingrandisce tutto
il contenuto, font e immagini comprese):
'*******************************
Private Declare Function SendMessageLong Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal _
wMsg As Long, ByVal wParam As Long, ByVal lParam _
As Long) As Long
Private Const WM_USER = &H400
Private Const EM_GETZOOM = (WM_USER + 224)
Private Const EM_SETZOOM = (WM_USER + 225)
Public Sub SetZoom(ByVal hWndRtf As Long, ByVal _
lNumerator As Long, ByVal lDenominator As Long)
    Dim lR As Long
    If lNumerator > 64 Or lDenominator > 64 Or _
lNumerator < 0 Or lDenominator < 0 Then
        Err.Raise 27110, App.EXEName & ".mRichEdit30", _
"Numerator and Denominator must be between 1 and 64"
    End If
    lR = SendMessageLong(hWndRtf, EM_SETZOOM, _
    lNumerator, lDenominator)
End Sub
'*******************************
Per fare le prove la cosa più semplice è creare due scrollbar,
tararle con Min=1 e Max=64, poi nel codice mettere
    SetZoom RichTextBox1.hwnd, Hscroll1.Value, Hscroll2.value
e vedere i risultati.
Bye, G.

L'RTF č un formato standard (di fatto č ancora il piů usato sui
mainframes), e le sua specifiche non prevedono l'allineamento a
pacchetto.
Esistono poi delle implementazioni non standard, come ad esempio fa Word
(che salva sempre in un 'suo' RTF, in chiaro o no), che espandono l'RTF
base. Ma non sono standard, e per essere utilizzate richiedono dll e/o
librerie specifiche.
Un esempio? Le tabelle, che l'RTF non supporta in alcun modo.
Mi domando se sia il caso di chiamarlo ancora RTF...


 Mi domando se sia il caso di chiamarlo ancora RTF...
Alt, non ci siamo. L'RTF è un formato proprietario Microsoft,
dalle specifiche pubbliche e documentate, attualmente alla
versione 1.6. Se alcune delle implementazioni di terze parti
non sono complete, perché comprendono solo un subset delle
caratteristiche, non significa che sia il formato a non prevederle.
Le tabelle, la giustifica a pacchetto e la sillabazione, tanto
per citare tre funzioni avanzate, fanno parte dello standard,
per quanto proprietario, e sono documentate.
Rich Text Format (RTF) Specification, version 1.6
http://msdn.microsoft.com/library/en-us/dnrtfspec/html/rtfspec.asp
Che poi la Microsoft continui ad aggiornare e modernizzare
il linguaggio, io lo trovo un fatto positivo, non negativo.
Proprio come, per restare nello stesso ambito, fa la Adobe
con il PostScript, che è proprietario, pubblico, documentato
e in varie versioni.
Bye, G.

 Alt, non ci siamo. L'RTF è un formato proprietario Microsoft,
l'RTF di Word è un formato proprietario MS.


 l'RTF di Word è un formato proprietario MS.
Non sono sicuro di aver capito la differenza con quel che dico io.
Intendi dire che l'RTF di Word usa comandi non documentati nel
documento che ho citato ? Scusa, ma non uso Word, altrimenti
non starei a chiedere, farei direttamente delle prove :-).
Bye, G.