Differenze tra le versioni di "Curvare il testo in una DrawingArea"

Da Gambas-it.org - Wikipedia.
 
(13 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Il caso è quello in cui si scrive un testo su una circonferenza ideale curvando ogni carattere in modo tale che il proprio asse verticale converga al centro di detta circonferenza. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
Il caso è quello in cui si scrive un testo su una circonferenza ideale curvando ogni carattere in modo tale che il proprio asse verticale converga al centro di detta circonferenza. <SUP>&#091;<B>[[#Note|Nota 1]]</b>&#093;</sup>
 
<BR>La rotazione è data dai valori presenti nei metodi "Paint.Traslate()" e "Paint.Rotate()" relativi alle misure dell'area di disegno e a quelle del testo.
 
<BR>La rotazione è data dai valori presenti nei metodi "Paint.Traslate()" e "Paint.Rotate()" relativi alle misure dell'area di disegno e a quelle del testo.
  
 
Nell'esempio, che segue, si scriveranno alcuni caratteri lungo il semicerchio superiore della circonferenza:
 
Nell'esempio, che segue, si scriveranno alcuni caratteri lungo il semicerchio superiore della circonferenza:
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   Dim DrawingArea1 As DrawingArea
 
   Dim DrawingArea1 As DrawingArea
Riga 19: Riga 19:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
   
 +
Public Sub DrawingArea1_Draw()
 +
 +
  Dim car As Byte[] = [65, 66, 67, 68, 69, 70, 71, 72]  <FONT Color=gray>' ''Imposta i caratteri da disegnare:''</font>
 +
  Dim b As Byte
 
   
 
   
 
   With Paint
 
   With Paint
Riga 33: Riga 37:
 
     .Translate(240, 304)
 
     .Translate(240, 304)
 
     .Rotate(Rad(90))
 
     .Rotate(Rad(90))
    .Font.Bold = True
+
     .DrawText(Chr(car[0]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
     .DrawText("A", 0, 0, 5, 5, Align.Left)
+
 
+
     For b = 1 To car.Max
    .Font.Bold = False
+
    .Translate(44, 14)
    .Translate(44, 14)
+
    .Rotate(Rad(315))
    .Rotate(Rad(315))
+
    .DrawText(Chr(car[b]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
    .DrawText("B", 0, 0, 5, 5, Align.Left)
+
    Next
 
 
    .Translate(44, 14)
 
    .Rotate(Rad(315))
 
    .DrawText("C", 0, 0, 5, 5, Align.Left)
 
 
 
    .Translate(44, 14)
 
     .Rotate(Rad(315))
 
    .DrawText("D", 0, 0, 5, 5, Align.Left)
 
 
 
    .Translate(44, 14)
 
    .Rotate(Rad(315))
 
    .DrawText("E", 0, 0, 5, 5, Align.Left)
 
 
 
    .Translate(44, 14)
 
    .Rotate(Rad(315))
 
    .DrawText("F", 0, 0, 5, 5, Align.Left)
 
 
 
    .Translate(44, 14)
 
    .Rotate(Rad(315))
 
    .DrawText("G", 0, 0, 5, 5, Align.Left)
 
 
 
    .Translate(44, 14)
 
    .Rotate(Rad(315))
 
    .DrawText("H", 0, 0, 5, 5, Align.Left)
 
 
   
 
   
 
     .End
 
     .End
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 
+
oppure ravvicinando i caratteri:
Altro esempio:
+
Public Sub DrawingArea1_Draw()
  '''Public''' Sub Form_Open()
+
 +
  Dim car As Byte[] = [65, 66, 67, 68, 69, 70, 71, 72]  <FONT Color=gray>' ''Imposta i caratteri da disegnare:''</font>
 +
  Dim b As Byte
 +
 +
  With Paint
 +
    .Arc(300, 300, 50, Rad(0), 360, False)
 +
    .Stroke
 +
    .DrawRect(250, 250, 50, 50, Color.Red, 1.0)
 +
    .DrawRect(300, 250, 50, 50, Color.Red, 1.0)
 +
    .DrawRect(250, 300, 50, 50, Color.Red, 1.0)
 +
    .DrawRect(300, 300, 50, 50, Color.Red, 1.0)
 +
 +
    .Translate(240, 304)
 +
    .Rotate(Rad(90))
 +
    .DrawText(Chr(car[0]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
 +
 +
    For b = 1 To car.Max
 +
      .Translate(14, 1)
 +
      .Rotate(Rad(346.8))
 +
      .DrawText(Chr(car[b]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
 +
    Next
 +
 +
    .End
 +
  End With
 +
 +
End
 +
e ancora di più:
 +
  Public Sub DrawingArea1_Draw()
 +
 +
  Dim car As Byte[] = [65, 66, 67, 68, 69, 70, 71, 72]  <FONT Color=gray>' ''Imposta i caratteri da disegnare:''</font>
 +
  Dim b As Byte
 +
 +
  With Paint
 +
    .Arc(300, 300, 50, Rad(0), 360, False)
 +
    .Stroke
 +
    .DrawRect(250, 250, 50, 50, Color.Red, 1.0)
 +
    .DrawRect(300, 250, 50, 50, Color.Red, 1.0)
 +
    .DrawRect(250, 300, 50, 50, Color.Red, 1.0)
 +
    .DrawRect(300, 300, 50, 50, Color.Red, 1.0)
 +
 +
    .Translate(240, 304)
 +
    .Rotate(Rad(90))
 +
    .DrawText(Chr(car[0]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
 +
 +
    For b = 1 To car.Max
 +
      .Translate(11.5, 0.6)
 +
      .Rotate(Rad(348.8))
 +
      .DrawText(Chr(car[b]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
 +
    Next
 +
 +
    .End
 +
  End With
 +
 +
End
 +
In quest'altro esempio, nel quale si consentirà di disegnare anche i caratteri speciali (come le lettere accentate):
 +
Public Sub Form_Open()
 
    
 
    
 
   Dim DrawingArea1 As DrawingArea
 
   Dim DrawingArea1 As DrawingArea
Riga 86: Riga 121:
 
     .Y = 0
 
     .Y = 0
 
   End With
 
   End With
 
 
'''End'''
 
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
  End
 +
 +
 +
Public Sub DrawingArea1_Draw()
 
    
 
    
 
   Dim b As Byte
 
   Dim b As Byte
   Dim bb As Byte[]
+
   Dim s As String
 
+
<FONT Color=gray>' ''L'uso di questo carattere (linea verticale) può essere utile per calibrare l'asse degli altri tipi di carattere:''</font>
   bb = Byte[].FromString("Linguaggio Gambas")
+
   Dim testo As String = String(36, String.Chr(&239F))
 
+
 
   With Paint
 
   With Paint
 
  <FONT Color=gray>' ''Imposta la posizione del primo carattere del testo da disegnare ruotato:''</font>
 
  <FONT Color=gray>' ''Imposta la posizione del primo carattere del testo da disegnare ruotato:''</font>
 
     .Translate(Me.W / 2.5, Me.H / 1.5)
 
     .Translate(Me.W / 2.5, Me.H / 1.5)
 
     .Rotate(Rad(160))
 
     .Rotate(Rad(160))
     .Font.Size = 20
+
     .Font.Size = 18
    .Font.Bold = True
 
 
     .Brush = .Color(Color.Red)
 
     .Brush = .Color(Color.Red)
     .DrawText(Chr(bb[0]), 0, 0, .Font.TextWidth(Chr(bb[0])), .Font.TextHeight(Chr(bb[0])), Align.Center)
+
    s = String.Mid(testo, 1, 1)
 +
     .DrawText(s, 0, 0, .Font.TextWidth(s), .Font.TextHeight(s), Align.Center)
 
    
 
    
 
  <FONT Color=gray>' ''Imposta la posizione dei restanti caratteri del testo da disegnare ruotato:''</font>
 
  <FONT Color=gray>' ''Imposta la posizione dei restanti caratteri del testo da disegnare ruotato:''</font>
     For b = 1 To bb.Max
+
     For b = 1 To <FONT Color=#B22222>24</font>
      .Font.Bold = False
+
<FONT Color=gray>' ''Aumentando un argomento, bisognerà ridurre l'altro empiricamente, e viceversa, per orientare l'asse verticale dei caratteri verso il centro del cerchio formato dal testo ruotato:''</font>
       .Translate(60, 10)
+
       .Translate(20.0, 1.5)
       .Rotate(Rad(340))
+
<FONT Color=gray>' ''Aumentando questo valore, il cerchio del testo si allarga sino a diventare a 360° una linea dritta:''</font>
       .Font.Size = 20
+
       .Rotate(Rad(350))
      .Font.Bold = True
+
       .Font.Size = 18
 
       .Brush = .Color(Color.Red)
 
       .Brush = .Color(Color.Red)
       .DrawText(Chr(bb[b]), 0, 0, .Font.TextWidth(Chr(bb[b])), .Font.TextHeight(Chr(bb[b])), Align.Center)
+
       s = String.Mid(testo, b, 1)
 +
      .DrawText(s, 0, 0, .Font.TextWidth(s), .Font.TextHeight(s), Align.Center)
 
     Next
 
     Next
 
      
 
      
 
     .End
 
     .End
 
   End With
 
   End With
 
+
  '''End'''
+
  End
  
  
  
 
=Note=
 
=Note=
[1] Vedere anche questa pagina: [[Curvare_la_linea_di_testo_in_un_oggetto_Image|Curvare la linea di testo in un oggetto Image]]
+
[1] Vedere anche questa pagina: [[Curvare la linea di testo in un oggetto Image]]

Versione attuale delle 10:36, 27 giu 2024

Il caso è quello in cui si scrive un testo su una circonferenza ideale curvando ogni carattere in modo tale che il proprio asse verticale converga al centro di detta circonferenza. [Nota 1]
La rotazione è data dai valori presenti nei metodi "Paint.Traslate()" e "Paint.Rotate()" relativi alle misure dell'area di disegno e a quelle del testo.

Nell'esempio, che segue, si scriveranno alcuni caratteri lungo il semicerchio superiore della circonferenza:

Public Sub Form_Open()
 
 Dim DrawingArea1 As DrawingArea
 
 With Me
   .Center
   .W = 600
   .H = 500
   .Arrangement = Arrange.Fill
 End With
 
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .X = 0
   .Y = 0
 End With
  
End


Public Sub DrawingArea1_Draw()

 Dim car As Byte[] = [65, 66, 67, 68, 69, 70, 71, 72]   ' Imposta i caratteri da disegnare:
 Dim b As Byte

 With Paint
   .Arc(300, 300, 50, Rad(0), 360, False)
   .Stroke
   .DrawRect(250, 250, 50, 50, Color.Red, 1.0)
   .DrawRect(300, 250, 50, 50, Color.Red, 1.0)
   .DrawRect(250, 300, 50, 50, Color.Red, 1.0)
   .DrawRect(300, 300, 50, 50, Color.Red, 1.0)

   .Translate(240, 304)
   .Rotate(Rad(90))
   .DrawText(Chr(car[0]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)

   For b = 1 To car.Max
    .Translate(44, 14)
    .Rotate(Rad(315))
    .DrawText(Chr(car[b]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
   Next 

   .End
 End With
 
End

oppure ravvicinando i caratteri:

Public Sub DrawingArea1_Draw()

 Dim car As Byte[] = [65, 66, 67, 68, 69, 70, 71, 72]   ' Imposta i caratteri da disegnare:
 Dim b As Byte

 With Paint
   .Arc(300, 300, 50, Rad(0), 360, False)
   .Stroke
   .DrawRect(250, 250, 50, 50, Color.Red, 1.0)
   .DrawRect(300, 250, 50, 50, Color.Red, 1.0)
   .DrawRect(250, 300, 50, 50, Color.Red, 1.0)
   .DrawRect(300, 300, 50, 50, Color.Red, 1.0)

   .Translate(240, 304)
   .Rotate(Rad(90))
   .DrawText(Chr(car[0]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)

   For b = 1 To car.Max
     .Translate(14, 1)
     .Rotate(Rad(346.8))
     .DrawText(Chr(car[b]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
   Next 

   .End
 End With

End

e ancora di più:

Public Sub DrawingArea1_Draw()

 Dim car As Byte[] = [65, 66, 67, 68, 69, 70, 71, 72]   ' Imposta i caratteri da disegnare:
 Dim b As Byte

 With Paint
   .Arc(300, 300, 50, Rad(0), 360, False)
   .Stroke
   .DrawRect(250, 250, 50, 50, Color.Red, 1.0)
   .DrawRect(300, 250, 50, 50, Color.Red, 1.0)
   .DrawRect(250, 300, 50, 50, Color.Red, 1.0)
   .DrawRect(300, 300, 50, 50, Color.Red, 1.0)

   .Translate(240, 304)
   .Rotate(Rad(90))
   .DrawText(Chr(car[0]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)

   For b = 1 To car.Max
     .Translate(11.5, 0.6)
     .Rotate(Rad(348.8))
     .DrawText(Chr(car[b]), 0, 0, .TextExtents(Chr(car[b])).W, .TextExtents(Chr(car[b])).H, Align.Normal)
   Next 

   .End
 End With

End

In quest'altro esempio, nel quale si consentirà di disegnare anche i caratteri speciali (come le lettere accentate):

Public Sub Form_Open()
 
 Dim DrawingArea1 As DrawingArea
 
 With Me
   .Center
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .X = 0
   .Y = 0
 End With

End


Public Sub DrawingArea1_Draw()
 
 Dim b As Byte
 Dim s As String
' L'uso di questo carattere (linea verticale) può essere utile per calibrare l'asse degli altri tipi di carattere:
 Dim testo As String = String(36, String.Chr(&239F))

 With Paint
' Imposta la posizione del primo carattere del testo da disegnare ruotato:
   .Translate(Me.W / 2.5, Me.H / 1.5)
   .Rotate(Rad(160))
   .Font.Size = 18
   .Brush = .Color(Color.Red)
   s = String.Mid(testo, 1, 1)
   .DrawText(s, 0, 0, .Font.TextWidth(s), .Font.TextHeight(s), Align.Center)
  
' Imposta la posizione dei restanti caratteri del testo da disegnare ruotato:
   For b = 1 To 24
' Aumentando un argomento, bisognerà ridurre l'altro empiricamente, e viceversa, per orientare l'asse verticale dei caratteri verso il centro del cerchio formato dal testo ruotato: 
     .Translate(20.0, 1.5)
' Aumentando questo valore, il cerchio del testo si allarga sino a diventare a 360° una linea dritta: 
     .Rotate(Rad(350))
     .Font.Size = 18
     .Brush = .Color(Color.Red)
     s = String.Mid(testo, b, 1)
     .DrawText(s, 0, 0, .Font.TextWidth(s), .Font.TextHeight(s), Align.Center)
   Next
   
   .End
 End With

End


Note

[1] Vedere anche questa pagina: Curvare la linea di testo in un oggetto Image