3 Stimmen

Bild im pictureBox drehen

Ich erstelle eine analoge Uhr, bei der ich das Bild in meinem pictureBox rotieren muss...

zum Beispiel möchte ich mein Bild um 6 Grad pro Sekunde drehen.

Was kann ich dafür tun?

Danke....

4voto

Alex Essilfie Punkte 11993

Ich erinnere mich daran, dass ich vor einiger Zeit eine Clock-ähnliche UserControl geschrieben habe. Hier ist der grundlegende Code, um Ihre Anfrage zu erfüllen.

Private Sub Paint_Clock(ByVal sender As Object, _
                        ByVal e As System.Windows.Forms.PaintEventArgs) _
                        Handles Clock.Paint

    Dim _independentHands as Boolean = False
    Dim g As Graphics = e.Graphics
    Dim centrePoint As Point = New Point(Clock.Width \ 2, Clock.Height \ 2)
    Dim _time As New TimeSpan(5, 2, 15)
    'pens'
    Dim hourPen As New Pen(Color.Black, 3)
    Dim minPen As New Pen(Color.Black, 2)
    Dim secPen As New Pen(Color.Red, 1)

    'clock hand lengths'
    Dim halfClockWidth As Integer = Clock.Width \ 2
    Dim hourLength As Integer = CInt(halfClockWidth * (4 / 6)) - 5
    Dim minLength As Integer = CInt(halfClockWidth * (5 / 6)) - 5
    Dim secLength As Integer = CInt(halfClockWidth * (5 / 6)) - 5
    Dim secLength2 As Integer = CInt(halfClockWidth * (1 / 6))

    'angles'
    Dim secAngle As Single = CSng(_time.Seconds / 60) * 360
    Dim secAngle2 As Single = secAngle - 180
    Dim minAngle As Single = CSng(_time.Minutes / 60) * 360
    Dim hrAngle As Single = CSng((_time.Hours - 12) / 12) * 360
    If Not _independentHands Then minAngle += (secAngle / 60)
    If Not _independentHands Then hrAngle += (minAngle / 12)

    'centre point'
    Dim pointPen As New Pen(Color.Black, 4)
    Dim pointRect As New Rectangle(centrePoint.X - 2, centrePoint.Y - 2, 4, 4)

    'antialias on'
    g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

    'draw the background'
    g.DrawImage(My.Resources.ClockBack, 0, 0, Clock.Width, Clock.Height)

    'draw the hands'
    g.DrawLine(hourPen, centrePoint, GetPoint2(centrePoint, hrAngle, hourLength))
    g.DrawLine(minPen, centrePoint, GetPoint2(centrePoint, minAngle, minLength))
    g.DrawLine(secPen, centrePoint, GetPoint2(centrePoint, secAngle, secLength))
    g.DrawLine(secPen, centrePoint, GetPoint2(centrePoint, secAngle2, secLength2))

    'draw the centre point'
    g.DrawEllipse(pointPen, pointRect)

    'draw the glass'
    g.DrawImage(My.Resources.ClockGlass, 0, 0, Clock.Width, Clock.Height)
End Sub

Private Function GetPoint2(ByVal startPoint As Point, _
                           ByVal angle As Single, _
                           ByVal length As Integer) As Point

    Dim x, y As Integer
    Dim sp As Point = startPoint

    'normalize'
    Do While angle - 360 > 0
        angle -= 360
    Loop
    Do While angle < 0
        angle += 360
    Loop
    If angle = 360 Then angle = 0

    Dim rad = angle * (Math.PI / 180)    'angle in radians'
    'calc the new point'
    x = CInt(length * Math.Sin(rad))
    y = CInt(length * Math.Cos(rad))

    Return New Point(sp.X + x, sp.Y - y)
End Function

Hinweise
1. Fügen Sie Ihrem Formular (oder UserControl) ein PictureBox mit dem Namen Clock hinzu.
2. Fügen Sie eine Ressource namens ClockBack für den Hintergrund Ihrer Uhr (das Zifferblatt der Uhr) hinzu.
3. Fügen Sie eine Ressource namens ClockGlass für die gläserne Oberfläche der Uhr hinzu.
4. Fügen Sie den obigen Code in Ihr Formular ein.
5. Legen Sie das Intervall eines Timers auf 1000 fest und lassen Sie sein Tick-Ereignis die Clock (die PictureBox) Refresh oder Invalidate.

Bitte beachten Sie, dass die Variable _independentHands die Uhrzeiger unabhängig voneinander macht, wenn sie auf true gesetzt ist.
Zum Beispiel wird bei Einstellung auf False um 4:30 der Stundenzeiger zwischen 4 und 5 liegen. Wenn True, wird der Stundenzeiger ab 4:00 bis 4:59:59 auf 4 stehen und springt um 5:00:00 auf 5.

Ich ziehe es vor, es auf false zu lassen, um das natürliche Uhrengefühl zu bewahren.

1voto

ratty Punkte 12746

0voto

PawanS Punkte 6803

Probiere dies aus

pictureBox1.Image.RotateFlip((RotateFlipType.Rotate90FlipX));

oder drehe dies in einem Thread alle 1000 ms

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X