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.1 Wend End Public Sub DrawingArea1_Draw() Dim x, y, r As Short Dim d, sx, sy, dmx, dmy As Single x = DrawingArea1.W * 0.5 y = DrawingArea1.H * 0.5 ' Imposta la dimensione del raggio del cerchio principale esterno del disegno dell'orologio: r = 200 d = 2.0 dmx = 228 dmy = 234 With Paint ' Imposta il cerchio esterno dell'orologio: .Brush = .Color(Color.Red) .LineWidth = 10.0 .Ellipse(x - r, y - r, r * d, r * d, Rad(0), Rad(360), False) .Stroke ' Imposta i numeri delle ore sul quadrante dell'orologio: .Brush = .Color(Color.Black) ' Imposta il tipo e la dimensione del "Font" usato per mostrare i numeri delle ore sul quadrante dell'orologio: .Font = Font["z003"] .Font.Size = 30.0 For c As Short = 30 To 360 Step 30 sx = Cos(Rad(c - 90)) sy = Sin(Rad(c - 90)) If c / 30 > 6 Then dmx = 236 dmy = 240 Endif .DrawText(CStr(c / 30), dmx * sx + x, dmy * sy + y, 4, 4, Align.Center) .Stroke Next ' Imposta il cerchio e la lancetta delle ore: .Brush = .Color(Color.DarkGreen) .LineWidth = 1.0 .Ellipse(x - ((r + 40 * d) / 2), y - ((r + 40 * d) / 2), r + 40 * d, r + 40 * d, Rad(0), Rad(360), False) .Stroke .LineWidth = 6.1 .MoveTo(x - 1, y - 1) .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, Rad(0), Rad(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, Rad(0), Rad(360), False) .Stroke .LineWidth = 1.0 .MoveTo(x, y) .LineTo(x - ((r - 10) * Sin(Rad(-s))), y - ((r - 10) * Cos(Rad(-s)))) .Stroke ' Imposta il cerchio pieno nero al centro dell'orologio: .Brush = .Color(Color.Black) .Ellipse(x - 7, y - 6, r * 0.06, r * 0.06, Rad(0), Rad(360), False) .Fill ' Termina l'operazione di disegno: .End End With End Public Sub Form_Close() bo = True End