0

我正在尝试以下代码:

public Form1()
{
    InitializeComponent();
    this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
}

private void Form1_MouseWheel(object sender, MouseEventArgs e)
{
    textBox1.Text += "delta : " + e.Delta + "\r\n";
}

但该事件似乎从未发生过。然后我注意到,一旦显示表单,文本框就获得了焦点,事实上,在我删除它之后,事件开始工作。

现在,问题:

  1. 每当窗体是顶部窗口时,即使我有一个文本区域,我如何才能触发事件?
  2. 我应该简单地将相同的事件添加到 textarea 还是有一种我看不到的更简单的方法来做到这一点?
  3. 有没有办法在让事件触发之前等待“车轮滚动”结束?我需要根据车轮滚动的时间以指数方式增加整数值
4

2 回答 2

0

将 Form1_MouseWheel 添加到表单和文本框(或者可能只是文本框) 在此代码中,所有鼠标滚轮在彼此之后的一秒内移动属于同一系列。

public partial class Form1 : Form
{
    private Timer second = new Timer();
    private int wheelMoves = 0;

    public Form1()
    {
        second.Interval = 1000;
        second.Tick += new EventHandler(second_Tick);
        InitializeComponent();
    }

    void second_Tick(object sender, EventArgs e)
    {
        second.Stop();
        // DoStuff with wheelmoves.
        textBox1.Text = wheelMoves.ToString() + " " + (wheelMoves * wheelMoves).ToString();
        wheelMoves = 0;
    }

    void Form1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        // reset the timer.
        second.Stop();
        second.Start();
        // Count the number of times the wheel moved.
        wheelMoves++;
    }
}

编辑:如果您添加另一个控件并让它窃取焦点,您不必将事件处理程序添加到文本框。这使文本框滚动功能保持不变,并且还调用自定义 MouseWheel 事件。

于 2012-09-25T09:16:40.523 回答
0

这里最有可能的是文本框自动窃取焦点,因为操作系统可能会自动假定任何鼠标滚轮滚动都指向它(因为它是唯一可用的文本编辑控件)。

可能的解决方案:

  1. 您可以像对文本框所说的那样添加鼠标滚轮事件
  2. SetStyle您可以通过在这样的自定义文本框类中使用来强制创建一个永远无法获得焦点的文本框:
类 unfocusableTextBox : 文本框
    {
        公共不可聚焦文本框(){
               SetStyle(ControlStyles.Selectable, false);
        }
    }
于 2012-09-25T09:17:01.333 回答