Rotate image in pictureBox
Solution 1
Here below links for question
C# Image/PictureBox Rotations - CodeProject
Rotating PictureBox Control - CodeProject
Solution 2
I remember ever writing a Clock-like UserControl some time ago. Here's the fundamental code to do your request.
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
Notes
1. Add a PictureBox with the name Clock to your form (or usercontrol)
2. Add a resource called ClockBack for the background of your clock (the clock's face).
3. Add a resource called ClockGlass for the clock's glassy face.
4. Drop the code above in your form.
5. Set a timer's interval to 1000 and have its Tick
event Refresh
or Invalidate
the Clock [which is a PictureBox].
Please note that the variable _independentHands
makes the clock's hands independent of each other when set to true.
For example, when set to False
, 4:30 will have the hour hand halfway between 4 and 5. When True
, the hour hand will be on 4 up till 4:59:59 and will 'jump' to 5 at 5:00:00.
I prefer to leave it to false so as to give the natural clock feel.
Comments
-
Javed Akram over 3 years
I am making an Analogue Clock in which i have to rotate the image in my pictureBox...
e.g. i want to rotate my image by 6 degrees every second.
what can i do for this?
Thanks....
-
ratty over 13 years@javed Akram you still need answer for your problem
-
Mikael over 13 years@Javed Akram Have you considered using an image list with images and just switched image every clock "tick"? That could be a rather suitable solution that does not require as much calculations every update.
-
Javed Akram over 13 years@Mikael,sorry but i am making Clock which will change at every second so according to you i need 43200 images(12X60X60)
-
Mikael over 13 years@Javed Akram, Ok, I was a bit unlucky when thinking and thought you only had the one hand moving around the clock..
-
Javed Akram over 13 years@Mikael, i am very sorry if i hurt you.....
-
-
Javed Akram over 13 yearsRotateFlipType have definate angles 90,180,270 but i want to rotate 6 degrees
-
Oliver over 13 years@Javed Akram: Yes, the code example just uses the Framework capabilities, but the two links should give you want you want.
-
ratty over 13 years@javed Akram see first link i posted , it holds what u want in c#
-
Alex Essilfie over 13 yearsSee the variable called _time on line 8 in my code? Just change it to the time you'd like to display. Preferrably have it loaded from a Class-level variable so that your timer can set the time before the clock is updated.
-
Bobby over 13 yearsNot what he asked for...he needs the ability to rotate the image by 6°, not 90°.