Disegnare un orologio su una DrawingArea prendendo l'orario del sistema
Da Gambas-it.org - Wikipedia.
Versione del 4 giu 2023 alle 12:08 di Vuott (Discussione | contributi)
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 del secondo corrente e lo moltiplica 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 fh, fm, fs, 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 ' Imposta il punto sulla circonferenza dove è posto il secondo n. 0, ossia il grado da dove avrà inizio a ruotare la lancetta: fh = h - 90 fm = m - 90 fs = s - 90 d = 2.0 With Paint .Brush = .Color(Color.Red) .Brush = .Color(Color.Red) .LineWidth = 10.0 .Ellipse(x - 2.5, y - 2.5, 5, 5, 0, 360, False) .Ellipse(x - ((r * d) / 2), y - ((r * d) / 2), r * d, r * d, 0, 360, False) .Stroke .Brush = .Color(Color.Green) .LineWidth = 6.1 .MoveTo(x, y) .LineTo(x + (r * Cos(Rad(fh))), y + (r * Sin(Rad(fh))))' - (r * 0.3)) .Stroke .Brush = .Color(Color.Blue) .LineWidth = 3 .MoveTo(x, y) .LineTo(x + (r * Cos(Rad(fm))), y + (r * Sin(Rad(fm))))' - (r * 0.1)) .Stroke .LineWidth = 1.0 .MoveTo(x, y) .LineTo(x + (r * Cos(Rad(fs))), y + (r * Sin(Rad(fs)))) .Stroke .End End With End Public Sub Form_Close() bo = True End