![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- VPN 何これ 1 2022/04/19 01:32
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Java java final 1 2022/06/10 22:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カメラスクロールするのを動画...
-
VBAのエラーについて、”実行時...
-
エクセル・VBA CheckBoxのオブ...
-
コントロールを移動できない
-
'ckbl' コントロールは作成され...
-
ExcelVBAでListViewが使用できない
-
コントロールの変数が定義され...
-
VBA_カレンダーコントロールの...
-
TabStripコントロールの上にLab...
-
アクセス特有の書き方?
-
間違えて配置してしまったコン...
-
(VBA)スピンボタンの大量...
-
excelのリストボックスで選択し...
-
Groupboxの配下のコントロール...
-
VBAでタブのページを削除す...
-
vb.netで画面のコントロールId...
-
パソコンへの「Dropbox...
-
ユーザーフォームを表示中にシ...
-
ユーザーフォームのテキストボ...
-
worksheetFunctionクラスのVloo...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
vb.netで画面のコントロールId...
-
EXCELでactivexコントロールを...
-
C#で角が丸いテキストボックス
-
(VBA)スピンボタンの大量...
-
chr関数の呼び出しで「プロ...
-
変数をコントロール型で使用す...
-
ExcelVBAでListViewが使用できない
-
VBAのエラーについて、”実行時...
-
間違えて配置してしまったコン...
-
VBAのフォームでTextBoxがいっ...
-
Groupboxの配下のコントロール...
-
excelのリストボックスで選択し...
-
ACCESS2010のVBAでフォーム内ク...
-
エクセルVBAでオプションボタン...
-
フォーム上の現在アクティブな...
-
ユーザーフォームで動的(Me.Con...
-
コンボボックスの文字によるif...
-
コントロールを移動できない
おすすめ情報