2

マウス ホイールのスクロールの開始と停止の間の時間間隔をキャプチャする方法はありますか? 実際には、マウスホイールを非常に速くスクロールしたときに、スクロールの開始と停止の間の間隔をキャプチャしたいと考えています。

私はすでに MouseWheel イベントを見てきましたが、私の要件を満たしていません。常に Delta 120 または -120 の値を与えるという意味では、マウスのスクロールの速度に応じて関数を呼び出したいと考えています。すぐに機能 2 を実行したいと思います。つまり、マウス スクロールの高速と通常の速度を区別する方法はありますか。

アドバイスをいただければ幸いです。

4

3 に答える 3

2

マウス ホイール イベントをキャプチャして、それらの間の長さを確認できませんか。基本的に、マウス ホイール イベントを取得したときにタイマーを開始し、次のイベントでタイマーの状態 (およびイベント間の経過時間) を確認して、ホイールが回転している速度を判断します。経過時間が特定のしきい値よりも小さい場合は機能 2 を実行し、特定のしきい値よりも速い場合は機能 1 を実行します。

スクロールが 1 回しかない場合にタイマーがオフになった場合は、おそらく機能 1 を実行するように設定する必要があります。

実際には、次の方法で実行できる場合があります。

マウス ホイール イベントでタイマーを開始し (ゆっくりとしたマウス ホイール操作を示す間隔で)、タイマーがオフになった場合は機能 1 を実行します。タイマーがオフになる前にマウス ホイール イベントが再び発生した場合は、タイマーをリセットし、カウンターをインクリメントします。 (あなたが何かをしたので、ホイールイベントの数を追跡するために)2番目の(長い)タイマーを開始します。カウンターが特定のしきい値よりも大きい場合は、機能 2 を実行します。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;
    }
于 2010-05-19T14:59:38.893 に答える
1

サム ホルダーが提案したように、同じ問題に直面している他のプログラマーを助けるために、彼のアドバイスの修正版をここに投稿します。

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;
    }
}
于 2010-05-20T07:27:41.873 に答える
1

Control.MouseWheelイベントを見てください。

于 2010-05-19T14:50:20.797 に答える