HScrollBar是水平滚动轴,与VscrollBar类似,在不内置支持翻页滚动的窗口中,经常有使用的需求。然而,要合理的控制使用HScrollBar并不是一件很容易的事情。HScroollBar有两个事件hScrollBar1_Scroll和hScrollBar1_ValueChanged,有一句笼统的概括这两个事件的使用时机:在移动过程中的处理放在_Scroll事件,在移动后处理放在_ValueChanged事件。这句话太笼统了,而且不是很准确,往往不能满足实际的使用需要。
1. hScrollBar1_ValueChanged(objectsender, EventArgs e)事件
当hScrollBar1.Value值改变时触发此事件,有两种途径:a>点击、拖动滚动条触发hScrollBar1_Scroll事件,从而引起hScrollBar1.Value值改变;b>直接设置hScrollBar1.Value值,如hScrollBar1.Value = 27。
2. hScrollBar1_Scroll(objectsender, ScrollEventArgs e)事件
当点击左右箭头、左右翻页、拖动滚动条时,会触发hScrollBar1_Scroll事件。这里的形参e有几个属性需要注意。
a>e.ScrollOrientation 获取Scroll滚动方向;
b> e.OldValue 获取旧的hScrollBar1.Value值;
c> e.NewValue 获取或设置新的hScrollBar1.Value值;
d> e.Type 获取发生的滚动事件类型。
public enum ScrollEventType //e.Type类型
{
SmallDecrement = 0, //上换行,Value变化了SmallChange量
SmallIncrement = 1, //下换行,Value变化了SmallChange量
LargeDecrement = 2, //上翻页,Value变化了LargeChange量
LargeIncrement = 3, //下翻页,Value变化了LargeChange量
ThumbPosition = 4, //滚动框停止拖动
ThumbTrack = 5, //滚动框当前正移动
First = 6, //滚动框被移动至Minimum位置—本人未发现
Last = 7, //滚动框被移动至Maximum位置—本人未发现
EndScroll = 8, //滚动停止
}
3. 基本属性
Value //获取或设置当前位置
LargeChange //获取或设置最大移动量
SmallChange //获取或设置最小移动量
Maximum //获取或设置最大值
Minimum //获取或设置最小值
a> 假设移动范围是100,如果Minimum=0,那么Maximum应该是99,而不是100;
b> 颜色值选择实例
this.hScrollBar1.SmallChange = 1;
this.hScrollBar1.LargeChange = 16;
this.hScrollBar1.Minimum = 0;
this.hScrollBar1.Maximum = 255 +this.hScrollBar1.LargeChange - 1;
假设换行跨度为1,翻页跨度为16,最小值为0,那么颜色值范围(0~255)的最大值怎么设置?注意,是255加上一页的范围再减1。因为Value的位置是页的左边,而最大值在页的右边。
4. 综合实例
a> 点击某按钮,改变Value值,触发的事件及顺序
private void btnChange_Click(object sender, EventArgse)
{
this.hScrollBar1.Value = 27;
}
只触发一个事件:
ValueChanged Event--Value = 27
b> 点击右键右换行,触发的事件及顺序
触发了三个事件,先SmallIncrement Event,此时Value值未改变;接着ValueChanged Event,Value发生了改变;最后EndScroll Even。
SmallIncrement Event--Value = 0
ValueChanged Event--Value = 1
EndScroll Event--Value = 1
c> 拖动滚动框,触发的事件及顺序
如下所示,拖动过程中,不断触发ThumbTrack Event事件,每当Value值改变时,触发ValueChanged Event事件,如快速拖动每次值可能会大于SmallChange(这里是1),拖动停止时触发ThumbPosition Event事件,最后触发EndScroll Event事件。
ThumbTrack Event--Value = 1
ThumbTrack Event--Value = 1
ValueChanged Event--Value = 4
ThumbTrack Event--Value = 4
ValueChanged Event--Value = 7
ThumbTrack Event--Value = 7
ValueChanged Event--Value = 11
ThumbTrack Event--Value = 11
ValueChanged Event--Value = 15
ThumbTrack Event--Value = 15
ValueChanged Event--Value = 20
ThumbTrack Event--Value = 20
ValueChanged Event--Value = 23
ThumbTrack Event--Value = 23
ValueChanged Event--Value = 26
ThumbTrack Event--Value = 26
ValueChanged Event--Value = 29
ThumbTrack Event--Value = 29
ValueChanged Event--Value = 30
ThumbTrack Event--Value = 30
ValueChanged Event--Value = 31
ThumbPosition Event--Value = 31
EndScroll Event--Value = 31
d> 右翻页,触发事件及顺序
如下所示,与下换行一样,触发了三个事件,先LargeIncrementEvent,此时Value值未改变,OldValue也未变,NewValue已经改变了;接着ValueChanged Event,Value发生了改变;最后EndScroll Even时,进入Scoll函数Value和OldValue已经边改了。
Enter Scroll--Value = 3, OldValue = 3,NewValue = 13
LargeIncrement Event--Value = 3,OldValue = 3, NewValue = 13
Leave Scroll--Value = 3, OldValue = 3,NewValue = 13
ValueChanged Event--Value = 13
Enter Scroll--Value = 13, OldValue = 13,NewValue = 13
EndScroll Event--Value = 13, OldValue =13, NewValue = 13
Leave Scroll--Value = 13, OldValue = 13,NewValue = 13
5. 总结
a> 如果响应代码放在hScrollBar1_ValueChanged中,有时就不能随意设置Value值,否则会触发多余的hScrollBar1_ValueChanged事件;如果不需要动态直接修改Value值,下面是一个好的选择。
private int _OldValue = 0;
private void btnChange_Click(object sender, EventArgs e)
{
MyFunScrollLines(this.hScrollBar1.Value - _OldValue);
_OldValue = this.hScrollBar1.Value;
}
b> 响应代码最好不要笼统的放在hScrollBar1_Scroll中,应该区分ScrollEventType类型,否则会触发两次hScrollBar1_Scroll事件。下面也是一种很好的换行翻页。
private void hScrollBar_Scroll(object sender, ScrollEventArgs e)
{
if (e.NewValue != e.OldValue)
{
this.curveChart1.ScrollLine(e.NewValue- e.OldValue);
}
//switch (e.Type)
//{
// case ScrollEventType.LargeIncrement:
// Console.WriteLine("LargeIncrement Event--Value = {0}",hScrollBar1.Value);
// break;
// case ScrollEventType.LargeDecrement:
// Console.WriteLine("LargeDecrement Event--Value = {0}", hScrollBar1.Value);
// break;
// case ScrollEventType.SmallIncrement:
// Console.WriteLine("SmallIncrement Event--Value = {0}",hScrollBar1.Value);
// break;
// ......
//}
}
c> Value最大值 = Maximum – LargeChange + 1。