Hallo zusammen,
was ich machen möchte.
Auf meinem Formular habe ich eine analoge Uhr die "gezeichnet" wird.
Dieser Uhr möchte ich eine gewisse Zeitzone vorgeben - die dann der User mit einer ComboBox auswählen kann.
Bisher habe ich folgenden Code hierfür.
Imports System.Drawing.Drawing2D
Public Class Form1
Dim timeUtc As Date = Date.UtcNow
Dim cstZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Central" & _
"Standard Time")
Dim cstTime As Date = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
Timer1.Enabled = True
Timer1.Interval = 1000
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Timer1.Tick
Me.Text = CStr(DateTime.Now)
Dim bmp As Bitmap = New Bitmap(310, 310)
Dim g As Graphics = Graphics.FromImage(bmp)
Dim gFont As New Font("Meta Plus LF", 20, FontStyle.Bold)
Dim f1 As Pen = New Pen(Color.SkyBlue, 10) ' Farbe Minutenzeiger
Dim f2 As Pen = New Pen(Color.SkyBlue, 3) ' Farbe Sekundenzeiger
Dim x, y, wi, b As Int32
Dim h As Int32 = cstTime.Hour ' aktuelle Stunde
Dim m As Int32 = cstTime.Minute ' aktuelle Minute
Dim s As Int32 = cstTime.Second ' aktuelle Sekunde
f1.EndCap = LineCap.Triangle
f1.StartCap = LineCap.RoundAnchor ' Kreis für den Zeigeranfang
g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality '
' Antialiasingmodus
g.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit '
' Schriftglättung
If h > 12 Then h -= 12 ' 12 Stundenanzeige
g.FillEllipse(Brushes.DarkGray, 1, 1, 308, 308) ' Farbe Rand
g.FillEllipse(Brushes.Silver, 15, 15, 280, 280) ' Farbe Ziffernblatt
b = 12
For wi = 90 To 420 Step 30
x = CInt(132 + Math.Cos(wi * Math.PI / 180) * 120) ' Grad In
' Bogenmaß
y = CInt(136 - Math.Sin(wi * Math.PI / 180) * 120) ' Grad In
' Bogenmaß
If b = 12 Then x -= 7
g.DrawString(Str(b), gFont, Brushes.Red, x, y) ' Stundenzahlen
' anzeigen
b -= 1
Next wi
gFont.Dispose()
For wi = 90 To 450 Step 6
x = CInt(154 + Math.Cos(wi * Math.PI / 180) * 135)
y = CInt(154 - Math.Sin(wi * Math.PI / 180) * 135)
g.FillEllipse(Brushes.Blue, x, y, 3, 3) ' Sekundenpunkte zeichnen
Next wi
g.TranslateTransform(-155, -155) 'Stundenzeiger
g.RotateTransform(-90 + h * 30 + (m \ 2), MatrixOrder.Append)
g.TranslateTransform(155, 155, MatrixOrder.Append)
g.DrawLine(f1, 155, 155, 245, 155) ' Stundenzeiger zeichnen
g.ResetTransform()
g.TranslateTransform(-155, -155) ' Minutenzeiger
g.RotateTransform(-90 + m * 6 + (s \ 10), MatrixOrder.Append)
g.TranslateTransform(155, 155, MatrixOrder.Append)
f1.Width = 8
g.DrawLine(f1, 155, 155, 280, 155) 'Minutenenzeiger zeichnen
f1.Dispose()
g.ResetTransform()
g.TranslateTransform(-155, -155) ' Sekundenzeiger
g.RotateTransform(-90 + s * 6, MatrixOrder.Append)
g.TranslateTransform(155, 155, MatrixOrder.Append)
g.DrawLine(f2, 155, 155, 280, 155) ' Sekundenzeiger zeichnen
f2.Dispose()
g.FillEllipse(Brushes.Red, 147, 147, 16, 16) ' Ziffernblatt
PictureBox1.Image = bmp ' Bitmap in die PictureBox laden
End Sub
End ClassAn sich läuft diese Uhr super, wenn die vorgegebene Zeit so dargestellt wird. Dann läuft auch der Sekundenzeiger.
Dim h2 As Int32 = DateTime.Now.Hour ' aktuelle Stunde
Dim m2 As Int32 = DateTime.Now.Minute ' aktuelle Minute
Dim s2 As Int32 = DateTime.Now.Second ' aktuelle Sekunde Gebe ich die Zeit vor wie im oben genannten Beispiel, dann wird mir zwar die aktuelle Zeit beim Laden angezeigt, jedoch läuft die Uhr nicht sichtbar weiter.
Dim h As Int32 = cstTime.Hour ' aktuelle Stunde
Dim m As Int32 = cstTime.Minute ' aktuelle Minute
Dim s As Int32 = cstTime.Second ' aktuelle Sekunde Der Hintergrund ist der, dass ich auch die verschiedenen Zeitzonen berücksichten und auch somit die Sommer-/Winterzeit.
Vielleicht laufe ich auch in die falsche Richtung - aus diesem Grund dieses Thema.
Grüße
Stefan |