Ruotare qualsiasi elemento da disegnare in una DrawingArea

Da Gambas-it.org - Wikipedia.

Per ottenere la rotazione di un qualsiasi elemento da disegnare (carattere alfanumerico, linee, disegni vari, immagini, etc.) in una "DrawingArea" (e comunque in qualunque altro Oggetto grafico disegnabile: "Image", "Picture", "ScrollArea"), è necessario considerare almeno tre aspetti:

  • l'angolo di rotazione del disegno da ruotare;
  • la posizione del centro di rotazione (ossia il punto intorno al quale il disegno ruoterà) sulla superficie dell'Oggetto grafico disegnabile;
  • la distanza orizzontale e verticale del disegno dal suo centro di rotazione.

Tali aspetti vengono gestiti mediante alcuni Metodi della Classe "Paint", e in particolare:

1) l'angolo di rotazione è gestito dal Metodo "Paint.Rotate()";
2) la posizione del centro di rotazione è gestito dal Metodo "Paint.Translate()";
3) la distanza orizzontale e verticale del disegno dal suo centro di rotazione è gestita dagli argomenti "x" e "y" (ossia dal 2° e dal 3° parametro) dei Metodi per disegnare qualcosa (ad esempio ".DrawText()" con "Paint").

Il Metodo "Paint.Rotate()" quale motore della rotazione di ciò che viene disegnato

La rotazione di uno o più caratteri, come di ogni altro elemento da disegnare all'interno di un Oggetto grafico disegnabile ("DrawingArea", "Image", "Picture"), è effettuata attraverso il il Metodo ".Rotate()" della Classe "Paint".

La rotazione con il Metodo ".Rotate()" di un elemento da disegnare avviene attorno al vertice individuato dalle coordinate x=0, y=0 dell'Oggetto grafico disegnabile, ossia attorno al vertice superiore sinistro dell'Oggetto, come agevolmente dimostrato dal seguente esempio, nel quale si farà ruotare un testo:

Private DrawingArea1 As DrawingArea
Private Slider1 As Slider
 
 
Public Sub Form_Open()
 
 With Me
   .W = Screen.AvailableWidth * 0.5
   .H = Screen.AvailableHeight * 0.5
   .Center
 End With
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .X = 0
   .Y = 0
   .W = Me.W * 0.8
   .H = Me.H
   .Background = Color.Orange
 End With
 With Slider1 = New Slider(Me) As "Slider1"
   .X = Me.W * 0.85
   .Y = Me.H * 0.02
   .W = Me.W * 0.1
   .H = Me.H * 0.95
   .MinValue = 0
   .MaxValue = 360
 End With
  
End
 
Public Sub DrawingArea1_Draw()
 
 Dim testo As String = "Gambas " & CStr(Slider1.Value) & "°"
 
 With Paint
' Impone la rotazione di tutto ciò che viene disegnato a seguire:
   .Rotate(Rad(-Slider1.Value))
   .Brush = Paint.Color(Color.Yellow)
   .Font = Font["Sans Serif, 22"]
' Il testo ruoterà comunque intorno al suo centro verticale e orizzontale:
   .DrawText(testo, -Paint.TextExtents(testo).W / 2, Paint.TextExtents(testo).H / 2, -.TextExtents(testo).W / 2, -.TextExtents(testo).H / 2, Align.Center)
' oppure anche così:
' .DrawText(testo, -.Font.TextWidth(testo) / 2, -.Font.TextHeight(testo) / 2, .Font.TextWidth(testo), .Font.TextHeight(testo), Align.Center)
    .End
 End With
 
End
 
Public Sub Slider1_Change()
 
 DrawingArea1.Refresh
 
End

Modificare la posizione del testo da disegnare sulla superficie dell'Oggetto grafico utilizzato

Per modificare la posizione (ossia le coordinate) standard dell'elemento da disegnare sulla superficie del suo Oggetto grafico, si dovrà utilizzare il Metodo ".Translate()" della Classe "Paint".
Nel seguente esempio, simile al precedente, il testo ruoterà intorno al suo centro, posto al centro della "DrawingArea":

Private DrawingArea1 As DrawingArea
Private Slider1 As Slider
 
 
Public Sub Form_Open()
 
 With Me
   .W = Screen.AvailableWidth * 0.5
   .H = Screen.AvailableHeight * 0.5
   .Center
 End With
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .X = 0
   .Y = 0
   .W = Me.W * 0.8
   .H = Me.H
   .Background = Color.Orange
 End With
 With Slider1 = New Slider(Me) As "Slider1"
   .X = Me.W * 0.85
   .Y = Me.H * 0.02
   .W = Me.W * 0.1
   .H = Me.H * 0.95
   .MinValue = 0
   .MaxValue = 360
 End With
  
End
 
Public Sub DrawingArea1_Draw()
 
 Dim testo As String = "Gambas " & CStr(Slider1.Value) & "°"
 
 With Paint
' Impone la rotazione del testo, disegnato, sempre al centro della "DrawingARea":
   .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
   .Rotate(Rad(-Slider1.Value))
   .Brush = Paint.Color(Color.Yellow)
   .Font = Font["Sans Serif, 22"]
' Il testo ruoterà comunque intorno al suo centro verticale e orizzontale:
   .DrawText(testo, -Paint.TextExtents(testo).W / 2, Paint.TextExtents(testo).H / 2, -.TextExtents(testo).W / 2, -.TextExtents(testo).H / 2, Align.Center)
' oppure anche così:
' .DrawText(testo, -.Font.TextWidth(testo) / 2, -.Font.TextHeight(testo) / 2, .Font.TextWidth(testo), .Font.TextHeight(testo), Align.Center)
    .End
 End With
 
End
 
Public Sub Slider1_Change()
 
 DrawingArea1.Refresh
 
End