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.