こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#でFormオブジェクトのイベントについて

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

投稿日時 - 2012-10-18 22:10:40

QNo.7755090

すぐに回答ほしいです

質問者が選んだベストアンサー

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

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

投稿日時 - 2012-10-19 10:40:26

補足

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

投稿日時 - 2012-10-19 12:29:11

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問