161 lines
6.3 KiB
QBasic
161 lines
6.3 KiB
QBasic
Sub Class_Globals
|
|
Private pnlClock As Panel ' Pannello in cui disegnare l'orologio
|
|
Private cvsClock As Canvas ' Canvas per disegnare l'orologio
|
|
Private clockDiameter As Float ' Diametro dell'orologio (in pixel)
|
|
Private centerX As Float ' Coordinata X del centro dell'orologio
|
|
Private centerY As Float ' Coordinata Y del centro dell'orologio
|
|
Private intervals As List ' Lista degli intervalli da disegnare
|
|
|
|
' Parametri di spessore
|
|
Private quadrantStrokeWidth As Float = 5dip
|
|
Private hourTickStrokeWidth As Float = 5dip
|
|
Private minuteTickStrokeWidth As Float = 2dip
|
|
Private intervalArcStrokeWidth As Float = 5dip
|
|
Private hourHandStrokeWidth As Float = 8dip
|
|
Private minuteHandStrokeWidth As Float = 5dip
|
|
End Sub
|
|
|
|
' Inizializza l'orologio
|
|
Public Sub Initialize(ParentPanel As Panel, PercentageOfWidth As Float)
|
|
pnlClock = ParentPanel
|
|
cvsClock.Initialize(pnlClock)
|
|
intervals.Initialize
|
|
SetClockSize(PercentageOfWidth)
|
|
End Sub
|
|
|
|
' Imposta la dimensione dell'orologio come percentuale della larghezza del pannello
|
|
Public Sub SetClockSize(PercentageOfWidth As Float)
|
|
clockDiameter = pnlClock.Width * PercentageOfWidth / 100
|
|
centerX = pnlClock.Width / 2
|
|
centerY = pnlClock.Height / 2
|
|
DrawClock
|
|
End Sub
|
|
|
|
' Imposta lo spessore delle varie linee
|
|
Public Sub SetStrokeWidths(quadrantWidth As Float, hourTickWidth As Float, minuteTickWidth As Float, intervalArcWidth As Float, hourHandWidth As Float, minuteHandWidth As Float)
|
|
quadrantStrokeWidth = quadrantWidth
|
|
hourTickStrokeWidth = hourTickWidth
|
|
minuteTickStrokeWidth = minuteTickWidth
|
|
intervalArcStrokeWidth = intervalArcWidth
|
|
hourHandStrokeWidth = hourHandWidth
|
|
minuteHandStrokeWidth = minuteHandWidth
|
|
DrawClock
|
|
End Sub
|
|
' Disegna l'orologio
|
|
Public Sub DrawClock
|
|
cvsClock.Initialize(pnlClock)
|
|
|
|
' Cancella il canvas
|
|
cvsClock.DrawColor(Colors.White)
|
|
|
|
' Disegna il cerchio esterno
|
|
cvsClock.DrawCircle(centerX, centerY, clockDiameter / 2, Colors.Black, False, quadrantStrokeWidth)
|
|
|
|
' Disegna le tacche delle ore e dei minuti
|
|
DrawTicks
|
|
|
|
' Disegna gli intervalli
|
|
For Each interval As Map In intervals
|
|
DrawInterval(interval.Get("startHour"), interval.Get("startMinute"), interval.Get("endHour"), interval.Get("endMinute"), interval.Get("color"), interval.Get("radius"), interval.Get("strokeWidth"))
|
|
Next
|
|
|
|
' Disegna le lancette
|
|
Dim now As Long = DateTime.Now
|
|
Dim Hours As Int = DateTime.GetHour(now) Mod 12
|
|
Dim Minutes As Int = DateTime.GetMinute(now)
|
|
Dim Seconds As Int = DateTime.GetSecond(now)
|
|
|
|
' Lancetta ore
|
|
Dim HourAngle As Float = -90 + Hours * 30 + Minutes / 2
|
|
DrawHand(centerX, centerY, clockDiameter * 0.25, HourAngle, hourHandStrokeWidth, Colors.Black)
|
|
|
|
' Lancetta minuti
|
|
Dim MinuteAngle As Float = -90 + Minutes * 6
|
|
DrawHand(centerX, centerY, clockDiameter * 0.4, MinuteAngle, minuteHandStrokeWidth, Colors.Blue)
|
|
|
|
' Lancetta secondi
|
|
Dim SecondAngle As Float = -90 + Seconds * 6
|
|
DrawHand(centerX, centerY, clockDiameter * 0.45, SecondAngle, 2dip, Colors.Red)
|
|
|
|
' Aggiorna il pannello
|
|
pnlClock.Invalidate
|
|
End Sub
|
|
|
|
' Disegna una singola lancetta
|
|
Private Sub DrawHand(x As Float, y As Float, length As Float, angle As Float, width As Float, color As Int)
|
|
Dim endX As Float = x + length * CosD(angle)
|
|
Dim endY As Float = y + length * SinD(angle)
|
|
cvsClock.DrawLine(x, y, endX, endY, color, width)
|
|
End Sub
|
|
' Disegna le tacche delle ore e dei minuti
|
|
Private Sub DrawTicks
|
|
For i = 0 To 59
|
|
Dim angle As Float = -90 + i * 6
|
|
Dim startX As Float
|
|
Dim startY As Float
|
|
Dim endX As Float
|
|
Dim endY As Float
|
|
If i Mod 5 = 0 Then
|
|
' Tacca delle ore
|
|
startX = centerX + (clockDiameter / 2 - 20dip) * CosD(angle)
|
|
startY = centerY + (clockDiameter / 2 - 20dip) * SinD(angle)
|
|
endX = centerX + (clockDiameter / 2 - 5dip) * CosD(angle)
|
|
endY = centerY + (clockDiameter / 2 - 5dip) * SinD(angle)
|
|
cvsClock.DrawLine(startX, startY, endX, endY, Colors.Black, hourTickStrokeWidth)
|
|
Else
|
|
' Tacca dei minuti
|
|
startX = centerX + (clockDiameter / 2 - 10dip) * CosD(angle)
|
|
startY = centerY + (clockDiameter / 2 - 10dip) * SinD(angle)
|
|
endX = centerX + (clockDiameter / 2 - 5dip) * CosD(angle)
|
|
endY = centerY + (clockDiameter / 2 - 5dip) * SinD(angle)
|
|
cvsClock.DrawLine(startX, startY, endX, endY, Colors.Black, minuteTickStrokeWidth)
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
' Aggiunge un intervallo da disegnare
|
|
Public Sub AddInterval(startHour As Int, startMinute As Int, endHour As Int, endMinute As Int, tipo As String)
|
|
Dim interval As Map
|
|
interval.Initialize
|
|
interval.Put("startHour", startHour)
|
|
interval.Put("startMinute", startMinute)
|
|
interval.Put("endHour", endHour)
|
|
interval.Put("endMinute", endMinute)
|
|
Select tipo.ToLowerCase
|
|
Case "mattino"
|
|
interval.Put("color", Colors.Blue)
|
|
interval.Put("radius", clockDiameter / 2 - 15dip)
|
|
interval.Put("strokeWidth", intervalArcStrokeWidth)
|
|
Case "pomeriggio"
|
|
interval.Put("color", Colors.Green)
|
|
interval.Put("radius", clockDiameter / 2 - 25dip)
|
|
interval.Put("strokeWidth", intervalArcStrokeWidth)
|
|
Case Else
|
|
Log("Tipo di intervallo non riconosciuto: " & tipo)
|
|
Return
|
|
End Select
|
|
intervals.Add(interval)
|
|
DrawClock
|
|
End Sub
|
|
|
|
' Disegna un intervallo sul quadrante
|
|
Private Sub DrawInterval(startHour As Int, startMinute As Int, endHour As Int, endMinute As Int, color As Int, radius As Float, strokeWidth As Float)
|
|
Dim startAngle As Float = (startHour Mod 12 + startMinute / 60) * 30 - 90
|
|
Dim endAngle As Float = (endHour Mod 12 + endMinute / 60) * 30 - 90
|
|
Dim sweepAngle As Float = endAngle - startAngle
|
|
If sweepAngle < 0 Then sweepAngle = sweepAngle + 360
|
|
cvsClock.DrawArc(centerX - radius, centerY - radius, centerX + radius, centerY + radius, startAngle, sweepAngle, False, color, strokeWidth)
|
|
End Sub
|
|
' Aggiorna l'orologio ogni secondo
|
|
Public Sub StartClock
|
|
Dim timer As Timer
|
|
timer.Initialize("timer", 1000)
|
|
timer.Enabled = True
|
|
End Sub
|
|
|
|
' Evento del timer per aggiornare l'orologio
|
|
Private Sub timer_Tick
|
|
DrawClock
|
|
End Sub
|
|
|