zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    JS-字符串截取方法slice、substring、substr的区别
    Vue中computed和watch的区别
    Vue响应式原理及总结
    JS实现深浅拷贝
    JS中new操作符源码实现
    点击页面出现爱心效果
    js判断对象是否为空对象的几种方法
    深入浅出js实现继承的7种方式
    es6-class
    详解 ESLint 规则,规范你的代码
  • 原文地址:https://www.cnblogs.com/fyhui/p/2129190.html
Copyright © 2011-2022 走看看