Slider 应用实例 2:用 Slider 设定值的范围

Slider 控件的另一特性是设定值的范围的能力。在下面的实现中,如果用户在单击 Slider 控件的同时按 SHIFT 键,就会产生 MouseDown 事件。该事件的代码设置了 SelectRange 和 SelStart 属性。当释放鼠标键时,将产生 MouseUp 事件,在该事件的代码中可以设置 SelLength 属性,由此即可得到值的范围。

下面的代码用到了如下对象:

用 Slider 控件设定值的范围

  1. 将 Slider 控件的 SelectRange 属性设为 True

  2. 在 MouseDown 事件的代码中,检测 SHIFT 键是否被按下。

  3. 在 MouseUp 事件的代码中,将 SelLength 属性设为 Value - SelStart

将 Slider 控件的 SelectRange 属性设为 True

如果要使 Slider 控件能够选定值的范围,就必须将 SelectRange 属性设为 True。可用 Form 对象的 Load 事件来实现,如下所示:

Private Sub Form_Load()
   sldSelect.SelectRange = True
End Sub

另外,也可以在设计时将该值设置为 True,只需用鼠标右键单击控件,并单击“属性”显示“属性页”对话框即可。

MouseDown 事件:检测 Shift 键是否被按下

为了选定范围,在移动 slider 的滑块时必须按住 SHIFT 键。MouseDown 事件具有 shift 参数,通过它能够确定 Shift 键是否被按下了。可以用 If 语句进行检测,代码如下:

Private Sub sldSelect_MouseDown _
(Button As Integer, Shift As Integer, _
x As Single, y As Single)

   If Shift = 1 Then 
      '如果按下了 Shift 键,
      '在此处进行处理。
   End If
End Sub

MouseDown 事件:设置 SelStart 和 SelLength 属性

如果按了 SHIFT 键,则代码将 SelStart 和 SelLength 属性设置为合适的值。其中 SelStart 属性指定了选定的值范围起点。在这里,SelStart 属性将被设为滑块所在的位置,也就是 Slider 控件的 Value 属性。

SelLength 属性指定了选定的值范围的大小;该属性以 SelStart 的值为起点。在 MouseDown 事件中,将选定新的范围,所以先前的范围必须被清除,也就是说将 SelLength 属性设置为 0。下面的代码完成了这个操作:

sldSelect.SelStart = SldResize.Value 
'将先前的 SelLength (如果有的话)设置为 0.
sldSelect.SelLength = 0 

MouseUp 事件:将 SelLength 设置为 Value - SelStart 属性

要选定一个范围,必须在拖动鼠标的同时按 SHIFT 键。设置新范围的代码应该放在 MouseUp 事件中,当 slider 的滑块被释放时会产生该事件。下面的代码用一个简单的公式设置了 SelLength 属性,即用滑块的值减掉 SelStart 属性的值:

sldSelect.Value - sldSelect.SelStart

然而,用户有可能在选定范围的过程中释放了 SHIFT 键。在这种情况下,不应选定范围。所以上述代码只有当 Shift 键被按下时才应被执行。同 MouseDown 事件一样,可以用 If 语句进行检测:

Private Sub sldSelect_MouseUp _
(Button As Integer, Shift As Integer, _
x As Single, y As Single)
   
   If Shift = 1 Then
   '如果用户从某点向后退,
   '将会产生错误。
   On Error Resume Next
   '否则用 SelStart 和当前值设置 SelLengthsldSelect.SelLength = _
      sldSelect.Value - sldSelect.SelStart
   Else
      '如果用户释放了 SHIFT 键,将 SelLength
      '设置为 0 (以清除 SelRange)并退出。
      sldSelect.SelLength = 0
   End If
End Sub

全部代码

全部代码如下所示:

Private Sub Form_Load()
   sldSelect.SelectRange = True
End Sub

Private Sub sldSelect_MouseDown _
(Button As Integer, Shift As Integer, _
x As Single, y As Single)

   If Shift = 1 Then
      sldSelect.SelStart = sldSelect.Value
      '将先前的 SelLength (如果有)设置为 0.
      sldSelect.SelLength = 0
   End If
End Sub

Private Sub sldSelect_MouseUp _
(Button As Integer, Shift As Integer, _
x As Single, y As Single)

   If Shift = 1 Then
   '如果用户从某点向后退,
   '将会产生错误。
   On Error Resume Next
   '否则用 SelStart 和当前值设置 SelLengthsldSelect.SelLength = _
      sldSelect.Value - sldSelect.SelStart
   Else
      '如果用户释放了 SHIFT 键,则将 SelLength 
      '设置为 0 (以清除 SelRange)并退出。
      sldSelect.SelLength = 0
   End If
End Sub