2010-11-10 7 views
3

Je fais une horloge analogique dans lequel je dois faire pivoter l'image dans mon picturebox ...Faire pivoter l'image dans picturebox

par exemple Je veux faire pivoter mon image de 6 degrés chaque seconde.

Que puis-je faire pour cela?

Merci ....

+0

@javed Akram vous devez toujours répondre à votre problème – ratty

+0

@ratty, oui s'il vous plaît ... –

+0

@Javed Akram Avez-vous pensé à utiliser une liste d'images avec des images et juste changé d'image chaque horloge "tick"? Cela pourrait être une solution plutôt appropriée qui ne nécessite pas autant de calculs à chaque mise à jour. – Mikael

Répondre

1
+0

RotateFlipType ont défini angles 90,180,270 mais je veux faire pivoter 6 degrés –

+1

@Javed Akram: Oui, l'exemple de code utilise simplement les capacités du cadre , mais les deux liens devraient vous donner envie que vous voulez. – Oliver

+0

@javed Akram voir le premier lien j'ai posté, il détient ce que vous voulez dans C# – ratty

4

Je me souviens jamais écrire un UserControl Clock comme il y a quelque temps. Voici le code fondamental pour faire votre demande.

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 

Remarques
1. Ajoutez un PictureBox avec le nom d'horloge à votre formulaire (ou usercontrol)
2. Ajouter une ressource appelée ClockBack pour l'arrière-plan de l'horloge (le visage de l'horloge).
3. Ajoutez une ressource appelée ClockGlass pour le cadran vitreux de l'horloge.
4. Déposez le code ci-dessus dans votre formulaire.
5. Définissez l'intervalle d'une minuterie sur 1000 et son Tick événement Refresh ou Invalidate l'horloge [qui est un PictureBox].


Veuillez noter que la variable _independentHands rend les aiguilles de l'horloge indépendantes l'une de l'autre lorsqu'elles sont définies sur true.
Par exemple, lorsqu'il est défini sur False, 4:30 aura l'aiguille des heures à mi-chemin entre 4 et 5. Lorsque True, l'aiguille des heures sera sur 4 jusqu'à 4:59:59 et passera à 5 à 5 : 00: 00 Je préfère laisser à false pour donner l'impression d'horloge naturelle.

+0

mains de l'horloge ne bougent pas ..... –

+0

Voir la variable appelée ** _ temps ** à la ligne 8 de mon code? Changez juste l'heure que vous souhaitez afficher. Il est préférable de le charger à partir d'une variable de niveau Classe afin que votre minuteur puisse définir l'heure avant la mise à jour de l'horloge. –

0

essayer cette

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

ou faire pivoter ce dans un fil pour 1000 ms

+0

Pas ce qu'il a demandé ... il a besoin de la possibilité de faire pivoter l'image de 6 °, pas 90 °. – Bobby

+0

Oui, comme j'ai commenté sur ratty –