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.
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: