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/contentid/266684
Ausgedruckt am: 22.11.2024 um 17:11 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
<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
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
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.
Private Sub nupHour_ValueChanged(sender As Object, e As EventArgs) Handles nupHour.ValueChanged, nupMinute.ValueChanged
SetTime(nupHour.Value, nupMinute.Value)
End Sub
E.