電子書籍の厳選無料作品が豊富!

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

A 回答 (1件)

ちょっとうろおぼえの記憶のままの回答ですが。



たしかイベントが発生した場合、子のコントロールから親へとどんどん受け渡されていくのが基本の仕様となっていたんじゃないかと思います。
これを親に渡さないようにするには、子のコントロールでイベントを受け取ったときに処理をしたあとでイベントのキャンセルをして親に渡っていかないようにプログラムしてあげる必要があったかと。
そういう観点で調べてみるといいかもしれません。

この回答への補足

回答ありがとうございます。
どうもMouseEnterとMouseLeaveを組み合わせてフォームコントロールの外部に出たときに
MouseLeave -= new EventHandler()を組み合わせる必要があったみたいです。

補足日時:2012/10/19 12:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!