Прокрутка колесика мыши - Как я могу зафиксировать временной интервал между началом и остановкой прокрутки? - PullRequest
2 голосов
/ 19 мая 2010

Есть ли способ зафиксировать интервал времени между началом и остановкой прокрутки колесика мыши? На самом деле я хочу зафиксировать интервал между началом прокрутки и остановкой, когда я очень быстро прокручиваю колесо мыши.

Я уже посмотрел событие MouseWheel, но оно не соответствует моему требованию. Считается, что он всегда дает значение Delta 120 или -120, но я хочу вызвать функцию в зависимости от скорости прокрутки мыши, например, когда я обычно прокручиваю мышь, я хочу выполнить функцию 1 и когда я прокручиваю мышь быстро я хочу выполнить функцию 2. Другими словами, есть ли способ отличить высокую прокрутку мыши от нормальной скорости.

Любой совет будет оценен.

Ответы [ 3 ]

2 голосов
/ 19 мая 2010

вы не можете захватить события колеса мыши и увидеть, как долго между ними. Как правило, запускайте таймер, когда вы получаете событие колеса мыши, а затем в следующем событии посмотрите, на каком времени находится таймер (и как много времени прошло между событиями), чтобы определить скорость вращения колеса? Если истекшее время меньше определенного порогового значения, выполните функцию 2, а если оно быстрее определенного порогового значения, выполните функцию 1.

Вам, вероятно, придется настроить его на выполнение функции 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;
    }
1 голос
/ 20 мая 2010

По предложению Сэма Холдера, я публикую здесь измененную версию его совета, чтобы помочь другим программистам, сталкивающимся с той же проблемой.

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;
    }
}
1 голос
/ 19 мая 2010

Посмотрите на событие Control.MouseWheel .

...