HScrollBar浅析

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。

你可能感兴趣的:(scroll)