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";
}

しかし、イベントが発生することはありませんでした。次に、フォームが表示されるとすぐに Textbox にフォーカスがあることに気付きました。実際、それを削除した後、イベントが機能し始めました。

さて、質問:

  1. テキストエリアがある場合でも、フォームが一番上のウィンドウであるときにイベントを発生させるにはどうすればよいですか?
  2. 同じイベントをテキストエリアに単純に追加する必要がありますか、それとも表示されない簡単な方法はありますか?
  3. イベントが発生する前に「ホイールの回転」が終了するのを待つ方法はありますか? ホイールが回転している時間に基づいて、整数値を指数関数的に増加させる必要があります
4

2 に答える 2

0

Form1_MouseWheelをフォームとテキストボックスの両方(またはテキストボックスのみ)に追加します。このコードでは、1秒以内のすべてのマウスホイールの動きは同じシリーズに属します。

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. テキストボックスに言ったように、mousewheelイベントを追加できます
  2. SetStyle次のようなカスタムテキストボックスクラスで使用することにより、フォーカスを受け取ることができないテキストボックスを強制的に作成できます。
クラスunfocusableTextBox:TextBox
    {{
        public unfocusableTextBox(){
               SetStyle(ControlStyles.Selectable、false);
        }
    }
于 2012-09-25T09:17:01.333 に答える