Visual Studio 2010 einfache analoge Uhr erstellen
Hallo,
ich versuche gerade mit VB2010 eine analoge Uhr zu erstellen.
Anforderungen:
- die Uhrzeiger (lineShape) sollten manuell einstellbar sein. (evtl. über NumericUpDown)
- die eingestellte Uhrzeit sollte in einem Textfeld angezeigt werden.
Mein Hauptproblem besteht darin die richtigen Koordinaten für die Zeiger einzustellen.
Für Euere Unterstützung vorab schon besten Dank.
Gruß
Herby_z
ich versuche gerade mit VB2010 eine analoge Uhr zu erstellen.
Anforderungen:
- die Uhrzeiger (lineShape) sollten manuell einstellbar sein. (evtl. über NumericUpDown)
- die eingestellte Uhrzeit sollte in einem Textfeld angezeigt werden.
Mein Hauptproblem besteht darin die richtigen Koordinaten für die Zeiger einzustellen.
Für Euere Unterstützung vorab schon besten Dank.
Gruß
Herby_z
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 266684
Url: https://administrator.de/forum/visual-studio-2010-einfache-analoge-uhr-erstellen-266684.html
Ausgedruckt am: 10.03.2025 um 21:03 Uhr
8 Kommentare
Neuester Kommentar
Hallo!
Ich habe eine ähnliche Anwendung so gelöst:
Anfangspunkt des Zeigers ist der Mittelpunkt, da ist schon mal einfach
Den Endpunkt des Zeigers habe ich folgendermaßen berechnet und den Winkel mittels Timer im Sekunden/Minuten/Stundentakt aktualisiert.
Gruß
Eisbein
Ich habe eine ähnliche Anwendung so gelöst:
Anfangspunkt des Zeigers ist der Mittelpunkt, da ist schon mal einfach
Den Endpunkt des Zeigers habe ich folgendermaßen berechnet und den Winkel mittels Timer im Sekunden/Minuten/Stundentakt aktualisiert.
Gruß
Eisbein
Hi,
hier ein Bsp:
Form1.Designer.vb
Form1.vb
hier ein Bsp:
Form1.Designer.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
Inherits System.Windows.Forms.Form
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Wird vom Windows Form-Designer benötigt.
Private components As System.ComponentModel.IContainer
'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.ShapeContainer1 = New Microsoft.VisualBasic.PowerPacks.ShapeContainer()
Me.MinutesShape = New Microsoft.VisualBasic.PowerPacks.LineShape()
Me.SecondsShape = New Microsoft.VisualBasic.PowerPacks.LineShape()
Me.HoursShape = New Microsoft.VisualBasic.PowerPacks.LineShape()
Me.Label1 = New System.Windows.Forms.Label()
Me.SuspendLayout()
'
'ShapeContainer1
'
Me.ShapeContainer1.Location = New System.Drawing.Point(0, 0)
Me.ShapeContainer1.Margin = New System.Windows.Forms.Padding(0)
Me.ShapeContainer1.Name = "ShapeContainer1"
Me.ShapeContainer1.Shapes.AddRange(New Microsoft.VisualBasic.PowerPacks.Shape() {Me.HoursShape, Me.MinutesShape, Me.SecondsShape})
Me.ShapeContainer1.Size = New System.Drawing.Size(292, 273)
Me.ShapeContainer1.TabIndex = 0
Me.ShapeContainer1.TabStop = False
'
'MinutesShape
'
Me.MinutesShape.Name = "MinutesShape"
Me.MinutesShape.X1 = 117
Me.MinutesShape.X2 = 192
Me.MinutesShape.Y1 = 98
Me.MinutesShape.Y2 = 121
'
'SecondsShape
'
Me.SecondsShape.Name = "SecondsShape"
Me.SecondsShape.X1 = 94
Me.SecondsShape.X2 = 169
Me.SecondsShape.Y1 = 58
Me.SecondsShape.Y2 = 81
'
'HoursShape
'
Me.HoursShape.Name = "HoursShape"
Me.HoursShape.X1 = 121
Me.HoursShape.X2 = 196
Me.HoursShape.Y1 = 126
Me.HoursShape.Y2 = 149
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Location = New System.Drawing.Point(13, 13)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(39, 13)
Me.Label1.TabIndex = 1
Me.Label1.Text = "Label1"
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(292, 273)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.ShapeContainer1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents ShapeContainer1 As Microsoft.VisualBasic.PowerPacks.ShapeContainer
Friend WithEvents SecondsShape As Microsoft.VisualBasic.PowerPacks.LineShape
Friend WithEvents MinutesShape As Microsoft.VisualBasic.PowerPacks.LineShape
Friend WithEvents HoursShape As Microsoft.VisualBasic.PowerPacks.LineShape
Friend WithEvents Label1 As System.Windows.Forms.Label
End Class
Form1.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Imports System.Drawing.Drawing2D
Imports Microsoft.VisualBasic.PowerPacks
Public Class Form1
Dim WithEvents mTimer As New Timers.Timer(10)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With SecondsShape
.X1 = ShapeContainer1.Width / 2
.Y1 = ShapeContainer1.Height / 2
.X2 = .X1
.Y2 = .Y2 - 50
End With
With MinutesShape
.X1 = ShapeContainer1.Width / 2
.Y1 = ShapeContainer1.Height / 2
.X2 = .X1
.Y2 = .Y2 - 50
End With
With HoursShape
.X1 = ShapeContainer1.Width / 2
.Y1 = ShapeContainer1.Height / 2
.X2 = .X1
.Y2 = .Y2 - 25
End With
mTimer.Start()
End Sub
Private Sub mTimer_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles mTimer.Elapsed
If Me.InvokeRequired Then
Me.Invoke(New Action(Of Object, Timers.ElapsedEventArgs)(AddressOf mTimer_Elapsed), sender, e)
Else
Static µSecond As Integer = 0
Static µMinute As Integer = 0
Static µHour As Integer = 0
Static µMinuteTick As Double = 0
Static µHourTick As Double = 0
µSecond += 1
If µSecond = 60 Then
µSecond = 0
End If
µMinuteTick += (1 / 60)
If µMinuteTick >= 60 Then
µMinuteTick = 0
End If
µHourTick += (1 / 720)
If µHourTick >= 12 Then
µHourTick = 0
End If
µMinute = Fix(µMinuteTick)
µHour = Fix(µHourTick)
Label1.Text = µHour.ToString("00") & ":" & µMinute.ToString("00") & ":" & µSecond.ToString("00")
With SecondsShape
Dim µR = (6 * (µSecond - 15)) / 180 * Math.PI
.X2 = .X1 + Math.Cos(µR) * 50
.Y2 = .Y1 + Math.Sin(µR) * 50
End With
With MinutesShape
Dim µR = (6 * (µMinuteTick - 15)) / 180 * Math.PI
.X2 = .X1 + Math.Cos(µR) * 50
.Y2 = .Y1 + Math.Sin(µR) * 50
End With
With HoursShape
Dim µR = (6 * (µHourTick - 15)) / 180 * Math.PI
.X2 = .X1 + Math.Cos(µR) * 25
.Y2 = .Y1 + Math.Sin(µR) * 25
End With
End If
End Sub
End Class
Was sollen die vielen "!" jetzt ausdrücken? Ich will bloß helfen, ok?
Eine Linie, die sich um 360° dreht stellt aber eine seeeehr beschränkte Uhr dar. Sie könnte ausschließlich Zeiten wie 06:00 Uhr anzeigen. (Und noch 11 weitere Kombinationen, die man aber erstmal berechnen müsste).
Du musst die Linie also eben nicht um 360° drehen sondern um einen ihrer Endpunkte.
Wie auch immer. Ich dachte, Du könntest VB lesen? Du brauchst doch nur den Ansatz aus der Sub mTimer_Elapsed nehmen und mit Übergabewerten kombinieren. z.B. so
So. das kombinierst Du jetzt noch mit zwei NumericUpDowns und gut is.
E.
Eine Linie, die sich um 360° dreht stellt aber eine seeeehr beschränkte Uhr dar. Sie könnte ausschließlich Zeiten wie 06:00 Uhr anzeigen. (Und noch 11 weitere Kombinationen, die man aber erstmal berechnen müsste).
Du musst die Linie also eben nicht um 360° drehen sondern um einen ihrer Endpunkte.
Wie auch immer. Ich dachte, Du könntest VB lesen? Du brauchst doch nur den Ansatz aus der Sub mTimer_Elapsed nehmen und mit Übergabewerten kombinieren. z.B. so
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub SetTime(µHour As Integer, µMinute As Integer)
If Me.InvokeRequired Then
Me.Invoke(New Action(Of Integer, Integer)(AddressOf SetTime), µHour, µMinute)
Else
Static µSecond As Integer = 0
With SecondsShape
Dim µR = (6 * (µSecond - 15)) / 180 * Math.PI
.X2 = .X1 + Math.Cos(µR) * 50
.Y2 = .Y1 + Math.Sin(µR) * 50
End With
With MinutesShape
Dim µR = (6 * (µMinute - 15)) / 180 * Math.PI
.X2 = .X1 + Math.Cos(µR) * 50
.Y2 = .Y1 + Math.Sin(µR) * 50
End With
With HoursShape
Dim µR = (6 * ((µHour * 5) - 15)) / 180 * Math.PI
.X2 = .X1 + Math.Cos(µR) * 25
.Y2 = .Y1 + Math.Sin(µR) * 25
End With
End If
End Sub
So. das kombinierst Du jetzt noch mit zwei NumericUpDowns und gut is.
1
2
3
2
3
Private Sub nupHour_ValueChanged(sender As Object, e As EventArgs) Handles nupHour.ValueChanged, nupMinute.ValueChanged
SetTime(nupHour.Value, nupMinute.Value)
End Sub
E.