技術(shù) 點
- 技術(shù)
- 點
- V幣
- 點
- 積分
- 33699
|
以下是引用竹笛在2003-4-7 21:37:15的發(fā)言:
我支持飄然妹子,從市場、用戶角度來說,Roadbeg的例子與飄然的例子是不可想提并論的,飄然的成本很低效果很好(站在haosonliao的巨人肩膀上),而Roadbeg的成本太高,效果較差。
成本太高可能是說我的源程明顯比別人的長.大家看一下我的源碼:
我的代碼確是較長,且定義了許多變量(常量也是預備將來轉(zhuǎn)換到變量的.),并且有些變量還沒用到.不錯,如果只是要實現(xiàn)示例子中所示的功能,根本用不了這許多代碼,但一開始我就不是只為實現(xiàn)這點簡單功能而設計的.而是考慮到如何讓它方便的轉(zhuǎn)換到類,如何更像一個真正的 slider 控件.
如何能方便的定義刻度數(shù)量,最小刻度值,最大刻度值,最小移動,最大移動距離,
如何能方便的限定 slider 的大小....
當然,我這個例子主要是模仿 slider 的刻度尺功能,而其它的例子都是模仿的滑塊功能,所以我的例子只能是跳躍移動(因為標準控件實現(xiàn)刻度尺功能的時候就是跳躍移動的),而其它例子都是平滑移動的.
Option Compare Database
Option Explicit
'本例主要模仿了 標準 slider 控件的 刻度尺功能.
'定義初始常量,這些常量為設計模式中的左邊距(或其它數(shù)值) 乘以 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 事件.
'在此事件中實現(xiàn)箭頭的短距離移動,即一次移動一個刻度.
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
'主體的單擊事件.
'在此事件中實現(xiàn)刻度的長距 |
|