|
以下是引用竹笛在2003-4-7 21:37:15的发言:
我支持飘然妹子,从市场、用户角度来说,Roadbeg的例子与飘然的例子是不可想提并论的,飘然的成本很低效果很好(站在haosonliao的巨人肩膀上),而Roadbeg的成本太高,效果较差。
成本太高可能是说我的源程明显比别人的长.大家看一下我的源码:
我的代码确是较长,且定义了许多变量(常量也是预备将来转换到变量的.),并且有些变量还没用到.不错,如果只是要实现示例子中所示的功能,根本用不了这许多代码,但一开始我就不是只为实现这点简单功能而设计的.而是考虑到如何让它方便的转换到类,如何更像一个真正的 slider 控件.
如何能方便的定义刻度数量,最小刻度值,最大刻度值,最小移动,最大移动距离,
如何能方便的限定 slider 的大小....
当然,我这个例子主要是模仿 slider 的刻度尺功能,而其它的例子都是模仿的滑块功能,所以我的例子只能是跳跃移动(因为标准控件实现刻度尺功能的时候就是跳跃移动的),而其它例子都是平滑移动的.
Option Compare Database
Option Explicit
'本例主要模仿了 标准 slider 控件的 刻度尺功能.
'定义初始常量,这些常量为设计模式中的左边距(或其它数值) 乘以 567
Private Const pcnt_lngArrowStart As Long = 477 '箭头起始位置的 left 属性值
Private Const pcnt_lngMinScale As Long = 8 '最小刻度标记
Private Const pcnt_lngMaxScale As Long = 16 '最大刻度标记
Private Const pcnt_lngScaleSpace As Long = 567 '两个刻度之间的距离.
Private Const pcnt_lngSliderTop As Long = 2041 'slider 的 top
Private Const pcnt_lngSliderHeight As Long = 624 'slider 的 height
Private Const pcnt_lngSliderLeft As Long = 340 'slider 的 left
Private Const pcnt_lngSliderWidth As Long = 4990 'slider 的 width
Private Const pcnt_lngArrowLeft As Long = 477 '滑块图的 left(即, slider 开始处的 left)
Private Const pcnt_lngBackLineLeft As Long = 576 '滑块背景线的 left(即, slider 开始处的 left
Private Const pcnt_lngBackLineWidth As Long = 4536 'width
Private p_lngLongMove As Long '最小单次移动距离
Private p_lngShortMove As Long '最大单次移动距离
Private p_lngSliderValue As Long 'slider 的当前值
Private p_lngSpaceScale As Long '最大移动距离与最小移动距离的比例
'
Private Sub Form_Load()
p_lngSpaceScale = 4 '最大距离与最小距离之间的比例.
p_lngShortMove = pcnt_lngScaleSpace '初始设置最小距离为两个刻度之单的距离
p_lngLongMove = p_lngShortMove * p_lngSpaceScale '初始设置最大距离为最小距离的 4 倍.
p_lngSliderValue = pcnt_lngMinScale '设置 slider 的当前值为最小刻度值
End Sub
'箭头的 mousemove 事件.
'在此事件中实现箭头的短距离移动,即一次移动一个刻度.
Private Sub imgArrow_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button And acLeftButton > 0 Then '检测左键是否被按下
If X > pcnt_lngScaleSpace / 2 Then '如果正在向正方向移动,且因为是跳跃移动,所以必须判断 mousemove 的距离是否已超过 1/2 间距,超过才进行移动,反之则不移动.
If imgArrow.Left + p_lngShortMove <= pcnt_lngArrowLeft + pcnt_lngBackLineWidth Then '判断移动后是否会超出范围
imgArrow.Left = imgArrow.Left + p_lngShortMove
p_lngSliderValue = p_lngSliderValue + 1
End If
ElseIf X < pcnt_lngScaleSpace / 2 * -1 Then '如果正在向负方向移动
If imgArrow.Left - p_lngShortMove >= pcnt_lngArrowLeft Then '判断移动后是否会超出范围
imgArrow.Left = imgArrow.Left - p_lngShortMove '进行单次短移动.
p_lngSliderValue = p_lngSliderValue - 1
End If
End If
Call ResetFontSize
End If
End Sub
'主体的单击事件.
'在此事件中实现刻度的长距 |
|