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はしません。どうして?
Windowsは、フォーカスのあるコントロールにWM_MOUSEWHEELメッセージを送信します。これはPanelにはなりません。フォーカスを取得できるコントロールではありません。パネルにコントロール、たとえばボタンを配置するとすぐに、ボタンにフォーカスとメッセージが表示されます。
ただし、ボタンはメッセージには使用されず、スクロールするものはありません。 Windowsはこれに気づき、メッセージを親に送信します。これがパネルです。スクロールします。
canがフォーカスを取得するカスタムパネルのコードは this answer にあります。
更新:この動作はWindows 10で変更されたことに注意してください。新しい[非アクティブウィンドウを上に移動するとスクロールする]オプションがデフォルトでオンになっています。これにより、マウスホイールの動作が、ブラウザやOfficeプログラムなどでの動作とより一貫したものになります。この特定のケースでは、ピクチャボックスがイベントを取得します。これに注意してください。
コンポーネントで「MouseWheel」イベントが表示されない場合は、手動で作成する必要があります。また、そのコンポーネントにフォーカスする必要があります。そうしないと、「MouseWheel」イベントがそのコンポーネントに対して機能しません。 「pictureBox1」の「MouseWheel」イベントの作成方法とその仕組みを紹介します。
コンストラクター内で、そのコンポーネントにマウスホイールイベントを作成します。
InitializeComponent();
this.pictureBox1.MouseWheel += pictureBox1_MouseWheel;
関数を手動で作成します。私の例によれば、「pictureBox1_MouseWheel」と呼びます
private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
//you can do anything here
}
そのコンポーネントでMouseHoverイベントを作成します(PicureBox1のプロパティに移動し、イベントを選択して、「MouseHover」を見つけ、「MouseHover」イベントをダブルクリックします)。
CALL "Focus()";そのMouseHoverイベント内のメソッド。
pictureBox1.Focus();
プログラムを実行します。
手動で接続するには...
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
}
より簡単な方法は、ビジュアルスタジオのパネルをクリックして、プロパティビューパネルに移動し、イベントを選択して、「マウスホイール」イベントを見つけてダブルクリックします。
Winformsでは、これは Control.MouseWheelイベント を使用して実現されます。
マウスホイールイベントの取得は注意が必要です。最も簡単な方法は
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" です。