Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Multimedia

k23:k23.3:k23.3.5:k23.3.5.1:start

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:

  • In den Zeilen 32 und 33 wird das Ziffernblatt geladen und in die DrawingArea eingezeichnet.
  • Den Zeigern werden Halbkreise als Endstück aufgesetzt – dafür sorgt die Zeile 62.
  • Die Aktualisierung des Wochentages und des aktuellen Datums erfolgen in den Zeilen 87 bis 89 stets um Mitternacht, da diese Angabe in der Zeile 13 nur einmalig zum Programmstart erfolgt.

Download

Die Website verwendet zwei temporäre Session-Cookies. Diese technisch notwendigen Cookies werden gelöscht, wenn der Web-Browser geschlossen wird! Informationen zu Cookies erhalten Sie in der Datenschutzerklärung.
k23/k23.3/k23.3.5/k23.3.5.1/start.txt · Zuletzt geändert: 20.06.2016 (Externe Bearbeitung)

Seiten-Werkzeuge