23.3.5.1 Analoge Uhr

Die in diesem Projekt vorgestellte Uhr wird Ihnen auch in anderen Kapiteln begegnen. Jetzt steht aber das Zeichnen der Uhr und ihrer Zeiger im Mittelpunkt.

C

Abbildung 23.3.5.1.1: Es ist immer später als Du denkst …

Der Quelltext ist so strukturiert, dass Sie das Zusammenwirken der einzelnen Prozeduren gut erkennen können:

[1] ' Gambas class file
[2] 
[3] Public Sub Form_Open()
[4]   FMain.Center
[5]   FMain.Resizable = False  
[6]   lblDayOfWeek.Foreground = Color.DarkGray 
[7] 
[8] ' AnalogUhr-Takt 
[9]   Uhr.Delay = 1000 ' 1s-Takt 
[10]   Uhr.Start
[11]   Uhr.Trigger
[12]   
[13]   lblDayOfWeek.Text = SetDayOfWeek()
[14] ' Print System.FirstDayOfWeek ' Zur Kontrolle
[15]   
[16] End ' Form_Open()
[17] 
[18] '-------------------------------------------------------------------------------------
[19] 
[20] Public Sub Draw_Uhr() ' Zeichnet Ziffernblatt und die drei Zeiger
[21]   Dim hZiffernblatt As Image
[22]   Dim x, y As Single
[23]   Dim iRadius As Integer
[24]   Dim Winkel As Float
[25]   Dim W, H As Float
[26]   Dim dNow As Date
[27]   Dim sTime As String
[28] 
[29]   W = dwTest.Width
[30]   H = dwTest.Height
[31]   
[32]   hZiffernblatt = Image.Load("Images/ziffernblatt.png")
[33]   Paint.DrawImage(hZiffernblatt, 0, 0, W, H) ' Zeichnet Ziffernblatt-Image   
[34]   
[35]   iRadius = 90 ' Basis-Länge eines Zeigers
[36]   dNow = Now   ' Aktuelle Zeit  
[37]   
[38] ' Stundenzeiger
[39]   Winkel = Hour(dNow) * 30 - 90 + 0.5 * Minute(dNow) ' Winkel des Stunden-Zeigers in Grad   
[40]   x = (iRadius - 20) * Cos(Winkel * Pi / 180)        ' Koordiante x, Umrechnung 1: Winkel in Bogenmaß
[41]   y = (iRadius - 20) * Sin(Rad(Winkel))              ' Koordiante y, Umrechnung 2: Winkel in Bogenmaß
[42]   Zeichnen(x, y, Color.Blue, 5, W, H, sTime)         ' Aufruf der Zeichnen-Funktion
[43]  
[44] ' Minutenzeiger
[45]   Winkel = Minute(dNow) * 6 - 90
[46]   x = (iRadius - 3) * Cos(Rad(Winkel))
[47]   y = (iRadius - 3) * Sin(Rad(Winkel))
[48]   Zeichnen(x, y, Color.Green, 3, W, H, sTime)
[49]     
[50] ' Sekundenzeiger
[51]   Winkel = Second(dNow) * 6 - 90 ' -90°, da bei 3 Uhr der Winkel 0° liegt - Bezugsachse!
[52]   x = iRadius * Cos(Rad(Winkel))
[53]   y = iRadius * Sin(Rad(Winkel))
[54]   Zeichnen(x, y, Color.Red, 1, W, H, sTime)
[55] 
[56] End ' Draw_Uhr()
[57] 
[58] Private Function Zeichnen(x As Float, y As Float, hColor As Integer, iLW As Integer, W As Float, H As Float, sTime As String) As Integer
[59]   ' Zeiger zeichnen
[60]     Paint.Brush = Paint.Color(hColor)
[61]     Paint.LineWidth = iLW ' Zeiger-Breite
[62]     Paint.LineCap = Paint.LineCapRound        
[63]     Paint.MoveTo(W / 2, H / 2) ' → Mitte der DrawingArea
[64]     Paint.RelLineTo(x, y)  
[65]     Paint.Stroke ' Zeichnet einen Zeiger
[66]   
[67]   ' Mittelpunkt-Kreis (schwarz)
[68]     Paint.Brush = Paint.Color(Color.Black)
[69]     Paint.Arc(W / 2, H / 2, 8) ' Radius = 8
[70]     Paint.Fill
[71]   
[72]   ' Mittelpunkt-Kreis (weiß)
[73]     Paint.Brush = Paint.Color(Color.White)
[74]     Paint.Arc(W / 2, H / 2, 6) ' Radius = 6
[75]     Paint.Fill
[76]   
[77]   ' Mittelpunkt (rot) zeichnen  
[78]     Paint.Brush = Paint.Color(Color.Red)
[79]     Paint.Arc(W / 2, H / 2, 4) ' Radius = 4
[80]     Paint.Fill
[81]     
[82] End ' Zeichnen(...)
[83] 
[84] Public Sub Uhr_Timer() ' Timer wird jede Sekunde aufgerufen 
[85] ' Zeichnet den aktuellen Inhalt der DrawArea neu, indem durch .Refresh dwTest_Draw() aufgerufen wird
[86]   dwTest.Refresh 
[87]   If Hour(Now) = 23 And Minute(Now) = 59 And Second(Now) = 59 Then
[88]      SetDayOfWeek()
[89]   Endif
[90] End ' Uhr_Timer()
[91] 
[92] Public Sub dwTest_Draw() 
[93]   Draw_Uhr ' Neuberechnung und Anzeige der Zeiger
[94] End ' dwTest_Draw()
[95] 
[96] Public Function SetDayOfWeek() As String
[97]   Dim aTagesListe As String[]
[98]   
[99] ' Ermittlung Wochentag und (formatiertes) Datum
[100]   aTagesListe = Split("Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", ",")  
[101]   Return aTagesListe[WeekDay(Now())] & " - " & Format(Now, "dd. mmmm yyyy")
[102]   
[103] End ' SetDayOfWeek()

Kommentar:

Download