Curvare la linea di testo in un oggetto Image
Da Gambas-it.org - Wikipedia.
Versione del 3 giu 2021 alle 14:37 di Vuott (Discussione | contributi)
Una 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:
Private Const GRADI_INIZIO As Float = 270.0 Private Const CURVATURA As Float = 8.0 Private Const FONT_NOME As String = "Liberation Mono" Private Const FONT_DIM As Float = 20 Public Sub Form_Open() Dim pb As PictureBox Dim testo As String Dim fo As Font Dim an As Float Dim ii As Image[] Dim b As Byte Dim i, im As Image Dim x, y, x_a, y_o, r As Short Me.Show With Me .Center .W = 600 .H = 600 .Arrangement = Arrange.Fill End With With pb = New PictureBox(Me) .X = 0 .Y = 0 End With ' Imposta il testo da disegnare: testo = "Questo e' un testo qualsiasi" ' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere: an = GRADI_INIZIO ii = New Image[] For b = 1 To Len(testo) ' Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere: With fo = New Font .Name = FONT_NOME .Size = FONT_DIM ' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica: i = New Image(.TextWidth(Mid(testo, b, 1)), .TextHeight(Mid(testo, b, 1)), Color.Transparent, gb.Standard) End With With Paint .Begin(i) .Font.Name = fo.Name .Font.Size = fo.Size .DrawText(Mid(testo, b, 1), 0, 0, i.W, i.H, Align.Normal) .End End With i = i.Rotate(Rad(-an)) ii.Push(i) an += CURVATURA Next x_a = pb.W / 2 ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale y_o = pb.H / 2 ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale r = 200 ' Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro) ' Crea l'Oggetto "Image" ove saranno disegnate le singole immagini dei caratteri per ricreare il testo ruotato: im = New Image(pb.W, pb.H, Color.Yellow, gb.Standard) ' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le singole Image nella Image "im" superficie principale: an = GRADI_INIZIO - 90.0 For b = 0 To ii.Max ' Imposta la curvatura delle singole Image dei caratteri: x = x_a + r * Cos(Rad(an)) y = y_o + r * Sin(Rad(an)) With Paint .Begin(im) .DrawImage(ii[b], x, y, ii[b].W, ii[b].H, 1.0, Null) .End End With ' Imposta la distanza delle singole immagini dei caratteri fra esse: an += CURVATURA Next pb.Image = im End