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 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 ' 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, 5) ' 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")) 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, 8, Colors.Black) ' Lancetta minuti Dim MinuteAngle As Float = -90 + Minutes * 6 DrawHand(centerX, centerY, clockDiameter * 0.4, MinuteAngle, 5, Colors.Blue) ' Lancetta secondi Dim SecondAngle As Float = -90 + Seconds * 6 DrawHand(centerX, centerY, clockDiameter * 0.45, SecondAngle, 2, 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 Int, 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, 5) 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, 2) 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) Case "pomeriggio" interval.Put("color", Colors.Green) interval.Put("radius", clockDiameter / 2 - 25dip) 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) 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 Dim path As Path path.Initialize(centerX, centerY) path.LineTo(centerX + radius * CosD(startAngle), centerY + radius * SinD(startAngle)) path.AddArc2(centerX - radius, centerY - radius, centerX + radius, centerY + radius, startAngle, sweepAngle) path.LineTo(centerX, centerY) path.Close cvsClock.ClipPath(path) cvsClock.DrawCircle(centerX, centerY, radius, color, True, 0) cvsClock.RemoveClip End Sub