※ ChatGPTを利用し、要約された質問です(原文:C#でFormオブジェクトのイベントについて)
C#でFormオブジェクトのイベントについて
このQ&Aのポイント
C#でFormオブジェクトのイベントについて詳しく教えてください。
FormオブジェクトにMouseWheelイベントを付加したとき、特定のコントロールのみでイベントが発生する方法について教えてください。
C#の質問はASPの項目でも問題ありませんか?他のプログラミング言語に比べて扱いがどうなっているのでしょうか?
C#において
Formオブジェクトに付加したコントロールのMouseWheelイベントについて質問です。
ある特定のコントロールにMouseWheelイベントを付加してホイールボタンの動きをつけたのですが、どうも特定のコントロールだけでなく、Formオブジェクト全体にWheelのイベントが付加されてしまっているようです。以下のコードがそれです。
using System;
using System.Windows.Forms;
using System.IO;
using System.Drawing;
//実行クラス
public class MainClass{
//実行メソッド
public static void Main(string [] args){
NewForm formObj =new NewForm();
formObj.SetLabel();
Application.EnableVisualStyles();
Application.Run(formObj);
}
}
//テスト用Form拡張クラス
public class NewForm :Form{
public Label labelObj;
public NewForm(){
this.Width = 600;
this.Height = 600;
this.Text ="wheel test";
}
public void SetLabel(){
this.labelObj =new Label();
this.labelObj.Width=200;
this.labelObj.Height =50;
this.labelObj.Location = new Point(10,10);
this.labelObj.Text ="ホイールのテスト";
this.labelObj.BackColor =Color.Red;
this.Controls.Add(this.labelObj);
//delegate
this.labelObj.MouseEnter += new EventHandler(this.EnterMethod);
this.labelObj.MouseWheel += new MouseEventHandler(this.WheelMethod);
}
//コントロールに追加したラベルにフォーカスした時のメソッド
public void EnterMethod(Object sender,EventArgs e){
this.labelObj.Focus();
}
public void WheelMethod(Object sender,MouseEventArgs e){
MessageBox.Show(e.Delta.ToString());
}
}
上記のコードだと、どうしても横幅200縦50のラベルコントロールの外側でもそのWheelイベントが
発生してしまうようです。
これを回避するために無理やり以下のようにソースを改変しました。
public void WheelMethod(Object sender,MouseEventArgs e){
//ディスプレイ基準ではなく、Formオブジェクト基準の座標の取得
Point tempObj = this.labelObj.PointToClient(Cursor.Position);
int tempX = tempObj.X;
int tempY =tempObj.Y;
if
(
(tempX > 0) && (tempX < this.labelObj.Width)
&&
(tempY > 0) && (tempY < this.labelObj.Height)
){
MessageBox.Show(tempObj.X.ToString());
MessageBox.Show(tempObj.Y.ToString());
MessageBox.Show(e.Delta.ToString());
}
}
マウスカーソルの位置が、特定のラベルの範囲内でのみ動くようにしたのですが
これのやりかたがベターというかC#上では定石なのでしょうか?
そもそも、なぜラベルコントロールに対してMouseWheelイベントをつけているのに
ラベルのある座標以外で、Wheelイベントが発生してしまうのでしょうか?
よろしくご教授ください。
ちなみにC#の質問ってこのASPの項目でもいいんですかね?
C,C++とは色が違うし、
そのほかのプログラミングのほうがよいのでしょうか?
補足
回答ありがとうございます。 どうもMouseEnterとMouseLeaveを組み合わせてフォームコントロールの外部に出たときに MouseLeave -= new EventHandler()を組み合わせる必要があったみたいです。