代码之家  ›  专栏  ›  技术社区  ›  Sheikh Rahat Ali

鼠标滚轮滚动-如何捕捉滚动开始和停止之间的时间间隔?

  •  2
  • Sheikh Rahat Ali  · 技术社区  · 16 年前

    有没有办法捕捉鼠标滚轮滚动开始和停止之间的时间间隔?实际上,当我快速滚动鼠标滚轮时,我想捕捉滚动开始和停止之间的间隔。

    任何建议都将不胜感激。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Sam Holder Brian Adams    16 年前

    你不能捕获鼠标滚轮事件并查看它们之间的间隔时间吗。基本上,当你得到一个鼠标滚轮事件时启动一个计时器,然后在下一个事件中查看计时器的位置(以及两个事件之间经过了多长时间),以确定滚轮的转动速度?如果elapsedtime小于某个阈值,则执行功能2;如果elapsedtime快于某个阈值,则执行功能1。

    事实上,你可以这样做:

    在鼠标滚轮事件中启动计时器(以指示鼠标滚轮缓慢转动的间隔),如果计时器关闭,则执行功能1。如果鼠标滚轮事件在计时器关闭之前再次发生,则重置计时器并增加一个计数器(以跟踪自您执行操作以来滚轮事件的数量),然后启动第二个(更长的)计时器。如果计数器大于某个阈值,则执行功能2。当第二个计时器结束时,重置计数器。沿着这些线的东西应该给你的能力,火功能1时,缓慢的车轮转动和功能2时,车轮迅速转动,通过几个'点击'。

    private void mouseWheelHandler (object sender, MouseEventArgs e)
        {
        slowTimer.Enabled = false;
        slowTimer.Stop ();            
        slowTimer.Interval = 200;
        slowTimer.Start();
        slowTimer.Enabled = true;
        m_counter++;
        Trace.WriteLine(string.Format("counter={0}", m_counter));
        if (fastTimer.Enabled==false)
            {
            fastTimer.Enabled = true;
            fastTimer.Interval = 150;
            fastTimer.Start ();
            }
        if (m_counter>5)
            {
            Trace.WriteLine("called method 2");
            m_counter = 0;
            fastTimer.Stop ();
            slowTimer.Enabled = false;
            slowCheckTimer.Stop ();                
            slowCheckTimer.Interval = 250;
            slowCheckTimer.Start();
            slowCheckTimer.Enabled = true;
            }
        }
    
    private void slowTimer_Tick(object sender, EventArgs e)
        {
        Trace.WriteLine("slow timer ticked");
        if (slowCheckTimer.Enabled==false)
            {
            Trace.WriteLine ("called method 1");
            }
    
        slowTimer.Enabled = false;
        }
    
    private void fastTimer_Tick(object sender, EventArgs e)
        {
        fastTimer.Enabled = false;
        Trace.WriteLine("fast timer ticked");
        m_counter = 0;
        fastTimer.Stop ();
        }
    
    private void slowCheckTimer_Tick(object sender, EventArgs e)
        {
        Trace.WriteLine("slow check timer ticked");
        slowCheckTimer.Stop ();
        slowCheckTimer.Enabled = false;
        }
    
        2
  •  1
  •   David Neale    16 年前

    看一看这个 Control.MouseWheel 事件。

        3
  •  1
  •   Sheikh Rahat Ali    16 年前

    正如samholder所建议的,我在这里发布了他的建议的修改版本,以帮助其他面临同样问题的程序员。

    public partial class Form1 : Form
    {
        int m_counter = 0;
    
        public Form1()
        {
            InitializeComponent();
    
            // Attach Mouse Wheel Event
            this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        }
    
        void Form1_MouseWheel(object sender, MouseEventArgs e)
        {
            // Refresh Slow Timer
            slowTimer.Enabled = false;
            slowTimer.Stop();
            slowTimer.Interval = 150;
            slowTimer.Start();
            slowTimer.Enabled = true;
    
            // Incremenet counter
            m_counter++;
    
            // Start Fast Timer
            if (fastTimer.Enabled == false)
            {
                fastTimer.Enabled = true;
                fastTimer.Interval = 50;
                fastTimer.Start();
            }
    
            // If this returns true call
            // the fast scroll implementation
            if (m_counter > 4)
            {
                Console.WriteLine("Quick Method Called");
                m_counter = 0;
                fastTimer.Stop();
                slowTimer.Enabled = false;
                slowCheckTimer.Stop();
                slowCheckTimer.Interval = 200;
                slowCheckTimer.Start();
                slowCheckTimer.Enabled = true;
            }
        }
    
        private void slowTimer_Tick(object sender, EventArgs e)
        {            
            if (slowCheckTimer.Enabled == false)
            {
                Console.WriteLine("Slow Method Called");
            }
    
            slowTimer.Enabled = false;
        }
    
        private void fastTimer_Tick(object sender, EventArgs e)
        {
            fastTimer.Enabled = false;            
            m_counter = 0;
            fastTimer.Stop();
        }
    
        private void slowCheckTimer_Tick(object sender, EventArgs e)
        {            
            slowCheckTimer.Stop();
            slowCheckTimer.Enabled = false;
        }
    }
    
    推荐文章