Disegnare un orologio su una DrawingArea prendendo l'orario del sistema

Da Gambas-it.org - Wikipedia.

Il codice, che segue, mostra come disegnare su una DrawingArea con la Classe Paint un essenziale orologio circolare con lancette, che segnano le ore, i minuti e i secondi, prendendo come riferimento l'orario del sistema mediante le funzioni native "Hour()", "Minute()" e "Second()".

Private DrawingArea1 As DrawingArea
Private bo As Boolean
Private h As Short
Private m As Short
Private s As Short


Public Sub _new()

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .Background = Color.SoftYellow
 End With

End

Public Sub Form_Open()

 Me.Show

 While Not bo
' Ottiene il valore dell'ora, del minuto e del secondo corrente e li moltiplica rispettivamente per un determinato valore, al fine di ottenere la correlazione fra gradi, ore, minuti e secondi sull'orologio grafico virtuale:
   h = Hour(Time) * 30
   m = Minute(Time) * 6
   s = Second(Time) * 6
   If Object.IsValid(DrawingArea1) Then DrawingArea1.Refresh
' L'uso dell'istruzione "Wait" consente di operare sui "Controlli" grafici eventualmente posti sul "Form":
   Wait 0.01
 Wend

End

Public Sub DrawingArea1_Draw()

 Dim x, y, r As Short
 Dim d As Single

 x = DrawingArea1.W * 0.5
 y = DrawingArea1.H * 0.5
' Imposta la dimensione del raggio del cerchio, ossia della lancetta dell'orologio:
 r = 200
 d = 2.0

 With Paint
' Imposta il cerchio esterno dell'orologio:
   .Brush = .Color(Color.Red)
   .LineWidth = 10.0
   .Ellipse(x - ((r * d) / 2), y - ((r * d) / 2), r * d, r * d, 0, 360, False)
   .Stroke
' Imposta il cerchio e la lancetta delle ore:
   .Brush = .Color(Color.Green)
   .LineWidth = 1.0
   .Ellipse(x - ((r + 40 * d) / 2), y - ((r + 40 * d) / 2), r + 40 * d, r + 40 * d, 0, 360, False)
   .Stroke
   .LineWidth = 6.1
   .MoveTo(x, y)
   .LineTo(x - ((r - 60) * Sin(Rad(-h))), y - ((r - 60) * Cos(Rad(-h))))
   .Stroke
' Imposta il cerchio e la lancetta dei minuti:
   .Brush = .Color(Color.Blue)
   .LineWidth = 1.0
   .Ellipse(x - ((r + 80 * d) / 2), y - ((r + 80 * d) / 2), r + 80 * d, r + 80 * d, 0, 360, False)
   .Stroke
   .LineWidth = 3.1
   .MoveTo(x, y)
   .LineTo(x - ((r - 20) * Sin(Rad(-m))), y - ((r - 20) * Cos(Rad(-m))))
   .Stroke
' Imposta il cerchio e la lancetta dei secondi:
   .Brush = .Color(Color.Orange)
   .Ellipse(x - ((r + 90 * d) / 2), y - ((r + 90 * d) / 2), r + 90 * d, r + 90 * d, 0, 360, False)
   .Stroke
   .LineWidth = 1.0
   .MoveTo(x, y)
   .LineTo(x - ((r - 10) * Sin(Rad(-s))), y - ((r - 10) * Cos(Rad(-s))))
   .Stroke
   .End
 End With

End

Public Sub Form_Close()

 bo = True

End