Skip to content

Creare un’immagine trasparente da un testo con stile su Windows

La textArea ha una funzionalità per ottenere l’immagine del testo con stile. Disponibile solo su macOS e Windows, su mac è trasparente mentre su windows no. Questo semplice metodo permette di ottenerla trasparente con il minimo costo.

Può capitare a volte di aver bisogno di un immagine che rappresenta il testo con stile presente in una textArea. La textArea ha una funzionalità per questo, in particolare la StyledTextPrinter della textArea.

Per cui definita un’immagine su cui vogliamo avere questo testo, possiamo chiamare il metodo DrawBlock della StyledTextPrinter della textArea per ottenere l’immagine del testo.

//Creo l'immagine, in questo caso larga 400 e alta 300
Dim p as new Picture(400, 300)
 
//Preparo l'oggetto StyledTextPrinter passando il Graphics di p
// e la larghezza desiderata
Dim stp As StyledTextPrinter=myTextArea.styledTextPrinter(p.Graphics, 400)
 
//Stampo il contenuto
stp.DrawBlock(0, 0, 300)

Il problema è che su windows l’immagine non è trasparente e risulta alla fine illeggibile.

Per risolvere il problema creaimo una estensione per la textArea in un modulo che chiamiamo getStyledPicture che andremo a chiamare semplicemente con:

Dim p as picture=myTextArea.getStyledPicture(400, 300)

Il metodo da scrivere è il seguente:

Public Function getStyledPicture(extends t as TextArea, w as integer, h as integer) as Picture
  #if TargetWindows
    //Creo l'immagine delle dimensioni desiderate e con la risoluzione dello schermo
    dim retPicture as Picture=t.TrueWindow.BitmapForCaching(w, h)
 
    //Calcolo le dimensioni reali
    dim ww as integer=w * t.TrueWindow.ScaleFactor
    dim hh as integer=w * t.TrueWindow.ScaleFactor
    //Stampo il contenuto della textArea usando le dimensioni calcolate
    Dim stp As StyledTextPrinter=t.styledTextPrinter(retPicture.Graphics, ww)
    stp.DrawBlock(0, 0, hh)
 
    //Creo l'immagine della maschere con le stesse dimensioni
    dim mPicture as Picture=t.TrueWindow.BitmapForCaching(w, h)
 
    //Applico uno sfondo bianco in quanto DrawBlock riempie solo lo spazio necessario
    //abbondo nel riempimento per evitare problemi di arrotondamento
    mPicture.Graphics.ForeColor=&cffffff
    mPicture.Graphics.FillRect 0, 0, w+1, h+1
 
    //Memorizzo i colori correnti e li cambio in nero
    dim st as StyledText=t.StyledText
    dim vColors() as color
    dim n as integer=st.StyleRunCount-1
    dim stt as StyleRun
    for i as integer=0 to n
      stt=st.StyleRun(i)
      vColors.Append stt.TextColor
      stt.TextColor=&c000000
    next
 
    //Stampo il contenuto della TextArea con il testo in nero nella maschera
    stp=t.styledTextPrinter(mPicture.Graphics, ww)
    stp.DrawBlock(0, 0, hh)
 
    //Ripristino i colori originali alla TextArea
    for i as integer=0 to n
      stt=st.StyleRun(i)
      stt.TextColor=vColors(i)
    next
 
    //Applico la maschera all'immagine
    retPicture.ApplyMask mPicture
    Return retPicture
  #Elseif TargetMacOS
    //Su macOS posso utilizzare normalmente la funzionalità
    dim retPicture as Picture=t.TrueWindow.BitmapForCaching(w, h)
    Dim stp As StyledTextPrinter=t.styledTextPrinter(retPicture.Graphics, w)
    stp.DrawBlock(0, 0, h)
    Return retPicture
  #Endif
End Function

Ecco un buon esempio di come sia facilmente estendibile il framework di Xojo.