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 Class An 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 |