我正在制作一个模拟时钟,在其中需要旋转pictureBox中的图像...
例如,我想每秒将我的图像旋转6度。
我该怎么做呢?
谢谢...
我正在制作一个模拟时钟,在其中需要旋转pictureBox中的图像...
例如,我想每秒将我的图像旋转6度。
我该怎么做呢?
谢谢...
我记得有一段时间我曾经编写过一个类似于时钟的用户控件。以下是实现您需求的基本代码。
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
注意事项
1. 在你的窗体(或用户控件)中添加一个名为Clock的PictureBox。
2. 添加一个名为ClockBack的资源,用于时钟的背景(即时钟的表盘)。
3. 添加一个名为ClockGlass的资源,用于时钟的玻璃表面。
4. 将上述代码放入你的窗体中。
5. 将定时器的间隔设置为1000,并使其Tick
事件Refresh
或Invalidate
时钟[即PictureBox]。
请注意,变量_independentHands
在设置为true时使时钟的指针相互独立。
例如,当设置为False
时,4:30时时针将处于4和5之间。当设置为True
时,时针将一直指向4,直到4:59:59,然后在5:00:00时“跳跃”到5。
我更喜欢将其保持为false,以给人以自然的时钟感觉。
试一下这个
pictureBox1.Image.RotateFlip((RotateFlipType.Rotate90FlipX));
或者在每1000毫秒内在一个线程中旋转它