Curvare la linea di testo in un oggetto Image
Da Gambas-it.org - Wikipedia.
Versione del 25 dic 2019 alle 09:00 di Vuott (Discussione | contributi) (Creata pagina con "Una prima soluzione per ottenere un testo curvato lungo una ideale circonferenza, potrebbe essere quella di creare tante piccoli oggetti di tipo ''Image'' per quante sono le l...")
Una prima soluzione per ottenere un testo curvato lungo una ideale circonferenza, potrebbe essere quella di creare tante piccoli oggetti di tipo Image per quante sono le lettere alfabetiche o le sillabe.
Ciascuna lettera o sillaba verrebbe quindi disegnata in uno di quegli oggetti Image.
Infine tali oggetti Image verrebbero adeguatamente ruotati in modo perpendicolare al raggio della circonferenza (o dell'arco) e disegnati/fusi in un Oggetto Image principale più grande, per formare il testo completo e apparentemente curvato.
Mostriamo un esempio pratico:
Public Sub Form_Open() Dim im, i As Image Dim b As Byte Dim x, y, x_a, y_o, r As Short Dim an As Float Dim cl As Integer Dim bb As New Byte[] Dim fo As Font Dim s As String With Me .Center .W = 600 .H = 600 End With x_a = 260 ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale y_o = 260 ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale r = 150 ' Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro) ' Impone il testo da disegnare. ' Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore: bb = bb.FromString("È lì giù che saprò se vivrà.") ' Imposta il colore di partenza: cl = Color.Blue ' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere: an += 204.0 ' Crea l'Oggetto "Image" principale, ove saranno mostrate tutte le lettere alfabetiche del testo: im = New Image(Me.W, Me.H, Color.White, gb.Standard) For b = 0 To bb.Max ' Verifica se il carattere è accentato (carattere ASCII speciale): If bb[b] > 127 Then ' Se è un carattere accentato, per riottenerlo nell'Image, combina i due valori che lo compongono: s = Chr(bb[b]) & Chr(bb[b + 1]) Inc b Else s = Chr(bb[b]) Endif ' Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere: With fo = New Font .Name = "FreeSans" .Size = 18 ' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica: i = New Image(.TextWidth(s) + 4, .TextHeight(s) + 4, Color.Transparent, gb.Standard) End With With Paint .Begin(i) .Font.Size = 18 .Font.Name = "FreeSans" .Brush = .Color(cl) .Text(s, 1, 1, i.W, i.H, Align.Center) .Fill .End End With i = i.Rotate(Rad(an + 90)) x = x_a + r * Cos(Rad(an)) y = y_o + r * Sin(Rad(an)) With Paint .Begin(im) .DrawImage(i, x, y, i.W, i.H) .End End With ' Imposta la distanza dei caratteri fra essi: an += 5.0 cl += 668457 Next With PictureBox1 .X = 0 .Y = 0 .W = Me.W .H = Me.H .Image = im End With End