Differenze tra le versioni di "Disegnare un orologio su una DrawingArea prendendo l'orario del sistema"
Da Gambas-it.org - Wikipedia.
(20 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Il codice, che segue, mostra come disegnare su una ''DrawingArea'' con la Classe ''Paint'' un essenziale orologio circolare con | + | 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 | + | 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 | Me.Show | ||
− | + | While Not bo | |
− | <FONT Color=gray>' ''Ottiene il valore del secondo corrente e | + | <FONT Color=gray>' ''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:''</font> |
− | + | h = Hour(Time) * 30 | |
− | DrawingArea1.Refresh | + | m = Minute(Time) * 6 |
− | <FONT Color=gray>' ''L'uso dell'istruzione "Wait" consente di operare | + | s = Second(Time) * 6 |
− | Wait 0. | + | If Object.IsValid(DrawingArea1) Then DrawingArea1.Refresh |
− | + | <FONT Color=gray>' ''L'uso dell'istruzione "Wait" consente di operare sui "Controlli" grafici eventualmente posti sul "Form":''</font> | |
+ | Wait 0.1 | ||
+ | Wend | ||
− | + | End | |
− | + | Public Sub DrawingArea1_Draw() | |
Dim x, y, r As Short | Dim x, y, r As Short | ||
− | Dim | + | Dim d, sx, sy, dmx, dmy As Single |
x = DrawingArea1.W * 0.5 | x = DrawingArea1.W * 0.5 | ||
y = DrawingArea1.H * 0.5 | y = DrawingArea1.H * 0.5 | ||
− | <FONT Color=gray>' ''Imposta la dimensione del raggio del cerchio | + | <FONT Color=gray>' ''Imposta la dimensione del raggio del cerchio principale esterno del disegno dell'orologio:''</font> |
− | r = | + | r = 200 |
− | + | d = 2.0 | |
− | + | ||
− | + | dmx = 228 | |
+ | dmy = 234 | ||
With Paint | With Paint | ||
+ | <FONT Color=gray>' ''Imposta il cerchio esterno dell'orologio:''</font> | ||
.Brush = .Color(Color.Red) | .Brush = .Color(Color.Red) | ||
− | .Ellipse(x - | + | .LineWidth = 10.0 |
− | .Ellipse(x - ((r * d) / 2), y - ((r * d) / 2), r * d, r * d, 0, 360, False) | + | .Ellipse(x - r, y - r, r * d, r * d, Rad(0), Rad(360), False) |
+ | .Stroke | ||
+ | <FONT Color=gray>' ''Imposta i numeri delle ore sul quadrante dell'orologio:''</font> | ||
+ | .Brush = .Color(Color.Black) | ||
+ | <FONT Color=gray>' ''Imposta il tipo e la dimensione del "Font" usato per mostrare i numeri delle ore sul quadrante dell'orologio:''</font> | ||
+ | .Font = Font["<FONT Color=#B22222>z003</font>"] | ||
+ | .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 | ||
+ | <FONT Color=gray>' ''Imposta il cerchio e la lancetta delle ore:''</font> | ||
+ | .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 | .Stroke | ||
+ | <FONT Color=gray>' ''Imposta il cerchio e la lancetta dei minuti:''</font> | ||
.Brush = .Color(Color.Blue) | .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 | ||
+ | <FONT Color=gray>' ''Imposta il cerchio e la lancetta dei secondi:''</font> | ||
+ | .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) | .MoveTo(x, y) | ||
− | .LineTo(x | + | .LineTo(x - ((r - 10) * Sin(Rad(-s))), y - ((r - 10) * Cos(Rad(-s)))) |
.Stroke | .Stroke | ||
+ | <FONT Color=gray>' ''Imposta il cerchio pieno nero al centro dell'orologio:''</font> | ||
+ | .Brush = .Color(Color.Black) | ||
+ | .Ellipse(x - 7, y - 6, r * 0.06, r * 0.06, Rad(0), Rad(360), False) | ||
+ | .Fill | ||
+ | <FONT Color=gray>' ''Termina l'operazione di disegno:''</font> | ||
.End | .End | ||
End With | End With | ||
− | + | End | |
+ | |||
+ | Public Sub Form_Close() | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End |
Versione attuale delle 16:10, 22 giu 2023
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