web-dev-qa-db-ja.com

パネルでマウスホイールをキャプチャする方法は?

C#でパネル上のマウスホイールをキャプチャする方法? WinFormsを使用しています

編集:

今はPictureBoxでやってみます。

私のコード:

this.pictureBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);    
this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)  
  {  
    MessageBox.Show("Click");  
  }

クリックで動作します。 Wheellingはしません。どうして?

23
Miko Kronn

Windowsは、フォーカスのあるコントロールにWM_MOUSEWHEELメッセージを送信します。これはPanelにはなりません。フォーカスを取得できるコントロールではありません。パネルにコントロール、たとえばボタンを配置するとすぐに、ボタンにフォーカスとメッセージが表示されます。

ただし、ボタンはメッセージには使用されず、スクロールするものはありません。 Windowsはこれに気づき、メッセージを親に送信します。これがパネルです。スクロールします。

canがフォーカスを取得するカスタムパネルのコードは this answer にあります。


更新:この動作はWindows 10で変更されたことに注意してください。新しい[非アクティブウィンドウを上に移動するとスクロールする]オプションがデフォルトでオンになっています。これにより、マウスホイールの動作が、ブラウザやOfficeプログラムなどでの動作とより一貫したものになります。この特定のケースでは、ピクチャボックスがイベントを取得します。これに注意してください。

21
Hans Passant

コンポーネントで「MouseWheel」イベントが表示されない場合は、手動で作成する必要があります。また、そのコンポーネントにフォーカスする必要があります。そうしないと、「MouseWheel」イベントがそのコンポーネントに対して機能しません。 「pictureBox1」の「MouseWheel」イベントの作成方法とその仕組みを紹介します。

  1. コンストラクター内で、そのコンポーネントにマウスホイールイベントを作成します。

    InitializeComponent();
    this.pictureBox1.MouseWheel += pictureBox1_MouseWheel;
    
  2. 関数を手動で作成します。私の例によれば、「pictureBox1_MouseWheel」と呼びます

    private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
    {
        //you can do anything here
    }
    
  3. そのコンポーネントでMouseHoverイベントを作成します(PicureBox1のプロパティに移動し、イベントを選択して、「MouseHover」を見つけ、「MouseHover」イベントをダブルクリックします)。

  4. CALL "Focus()";そのMouseHoverイベント内のメソッド。

    pictureBox1.Focus();
    
  5. プログラムを実行します。

35
Shehan Silva

手動で接続するには...

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
    ///process mouse event
}

より簡単な方法は、ビジュアルスタジオのパネルをクリックして、プロパティビューパネルに移動し、イベントを選択して、「マウスホイール」イベントを見つけてダブルクリックします。

7
Gerald Davis

Winformsでは、これは Control.MouseWheelイベント を使用して実現されます。

5
Ian Nelson

マウスホイールイベントの取得は注意が必要です。最も簡単な方法は

this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

の代わりに

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

このようにして、フォームはコントロールではなくイベントを取得します。この方法は簡単ですが、1つの問題があります。フォームで使用できるマウスホイールイベントは1つだけです。

マウスホイールイベントを取得するための複数のコントロールがある場合、最善の方法は この回答は "Shehan Silva-weltZ" です。

1
Mokhabadi