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++とは色が違うし、 そのほかのプログラミングのほうがよいのでしょうか?
↧