
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++とは色が違うし、
そのほかのプログラミングのほうがよいのでしょうか?
No.1ベストアンサー
- 回答日時:
ちょっとうろおぼえの記憶のままの回答ですが。
たしかイベントが発生した場合、子のコントロールから親へとどんどん受け渡されていくのが基本の仕様となっていたんじゃないかと思います。
これを親に渡さないようにするには、子のコントロールでイベントを受け取ったときに処理をしたあとでイベントのキャンセルをして親に渡っていかないようにプログラムしてあげる必要があったかと。
そういう観点で調べてみるといいかもしれません。
この回答への補足
回答ありがとうございます。
どうもMouseEnterとMouseLeaveを組み合わせてフォームコントロールの外部に出たときに
MouseLeave -= new EventHandler()を組み合わせる必要があったみたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELでactivexコントロールを...
-
'ckbl' コントロールは作成され...
-
ExcelVBAでListViewが使用できない
-
OCXって何ですか?
-
カメラスクロールするのを動画...
-
VBA ユーザーフォームの Keypre...
-
エクセル・VBA CheckBoxのオブ...
-
Labelコントロールの(左右)余...
-
エクセルVBAでオプションボタン...
-
チェックボックスをオンにした...
-
ActiveXコントロールはどこへい...
-
With~EndWithの省略部分と引数...
-
TabStripコントロールの上にLab...
-
ActiveX DLL と ActiveXコント...
-
全てのオブジェクトのプロパテ...
-
VBAのエラーについて、”実行時...
-
OCX (ACTIVEX)で非表示にすると...
-
C#で角が丸いテキストボックス
-
ActiveXコントロールを作成して...
-
Winsockのオブジェクトエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAでオプションボタン...
-
エクセル・VBA CheckBoxのオブ...
-
カメラスクロールするのを動画...
-
EXCELでactivexコントロールを...
-
VBA ユーザーフォームの Keypre...
-
'ckbl' コントロールは作成され...
-
ExcelVBAでListViewが使用できない
-
チェックボックスをオンにした...
-
ユーザーフォームで動的(Me.Con...
-
chr関数の呼び出しで「プロ...
-
全てのオブジェクトのプロパテ...
-
vb.netで画面のコントロールId...
-
間違えて配置してしまったコン...
-
Excel VBA で Richtextboxを使...
-
VBAのフォームでTextBoxがいっ...
-
OCXって何ですか?
-
C# Form上に配置されたコントロ...
-
エクセル コントロールツール...
-
変数をコントロール型で使用す...
-
Groupboxの配下のコントロール...
おすすめ情報