滚动的数字轮(抽奖用),快来顶
' Roller 是一个数字的滚动条。它模拟一个数字轮子在滚动,数字从0到9,
' 滚动的方向和速度可以调节。喊停后,该轮子会停在某个数字。
' 在实现方面,使用4个Label, 其实只显示3个 。
' Roller的状态, INITIALIZED,--start---> ROLLING ----pause---->SLOWING_DOWN ---->PAUSED ----start-->ROLLING
' PAUSED ---- dispose----> IDLE
' 使用 New, Start, Pause就够了。4个Label必须在同一列
Public MustInherit Class Roller
Public Const ST_INITIALIZED = 1
Public Const ST_ROLLING = 2
Public Const ST_SLOWING_DOWN = 3
Public Const ST_PAUSED = 4
Protected _value As Integer '喊停后停在哪个数字
Protected state As Integer
Protected l1, l2, l3, l4 As System.Windows.Forms.Label
Protected iStep As Integer
Protected top, size As Integer
Public Sub setLabels(ByRef label1 As Label, _
ByRef label2 As Label, _
ByRef label3 As Label, _
ByRef label4 As Label, _
ByVal drop_step As Integer)
state = ST_INITIALIZED
l1 = label1
l2 = label2
l3 = label3
l4 = label4
iStep = drop_step
End Sub
Public Sub Start()
If state = ST_INITIALIZED Or state = ST_PAUSED Then state = ST_ROLLING
End Sub
Public Sub ResetPosition()
l1.Top = top
l2.Top = top + size
l3.Top = top + size * 2
l4.Top = top + size * 3
End Sub
' 喊停
Public Sub Pause()
If state = ST_ROLLING Then state = ST_SLOWING_DOWN
End Sub
Public Function isPaused() As Boolean
isPaused = (state = ST_PAUSED)
End Function
Public Function getState() As Integer
getState = state
End Function
Public MustOverride Sub Reset()
Public Overridable Sub move()
If state = ST_ROLLING Or state = ST_SLOWING_DOWN Then
l1.Top = l1.Top + iStep
l2.Top = l2.Top + iStep
l3.Top = l3.Top + iStep
l4.Top = l4.Top + iStep
End If
End Sub
Public Function Value() As Integer
Value = _value
End Function
End Class
Public Class RollerDown
Inherits Roller
Public Sub New( _
ByRef label1 As Label, _
ByRef label2 As Label, _
ByRef label3 As Label, _
ByRef label4 As Label, _
ByVal drop_step As Integer)
setLabels(label1, label2, label3, label4, drop_step)
l1.Text = 0
l2.Text = 1
l3.Text = 2
l4.Text = 3
Size = 88
top = -32 - Size
ResetPosition()
End Sub
Public Overrides Sub Reset()
Dim i As Integer
'循环设置数字
l4.Text = l3.Text
l3.Text = l2.Text
l2.Text = l1.Text
i = CInt(l2.Text) - 1
If i < 0 Then i = 9
l1.Text = CStr(i)
ResetPosition()
End Sub
Public Overrides Sub move()
If state = ST_ROLLING Then
MyBase.move()
If l1.Top >= top + Size Then Reset()
End If
If state = ST_SLOWING_DOWN Then
MyBase.move()
If l1.Top >= top + Size Then
Reset()
state = ST_PAUSED
_value = CInt(l3.Text)
End If
End If
End Sub
End Class
Public Class RollerUp
Inherits Roller
Public Sub New( _
ByRef label1 As Label, _
ByRef label2 As Label, _
ByRef label3 As Label, _
ByRef label4 As Label, _
ByVal drop_step As Integer)
Size = 88
top = -32
setLabels(label1, label2, label3, label4, -drop_step)
l1.Text = 1
l2.Text = 2
l3.Text = 3
l4.Text = 4
ResetPosition()
End Sub
Public Overrides Sub Reset()
Dim i As Integer
'循环设置数字
l1.Text = l2.Text
l2.Text = l3.Text
l3.Text = l4.Text
i = CInt(l4.Text) + 1
If i > 9 Then i = 0
l4.Text = CStr(i)
ResetPosition()
End Sub
Public Overrides Sub move()
If state = ST_SLOWING_DOWN Then
MyBase.move()
If l2.Top <= top Then
Reset()
state = ST_PAUSED
_value = CInt(l2.Text)
End If
End If
If state = ST_ROLLING Then
MyBase.move()
If l2.Top <= top Then Reset()
End If
End Sub
End Class