グループボックスは、その中に他のコントロールを格納する静的コントロールです。正しくレイアウトされている場合、ユーザーインターフェイスを直感的にするために、純粋に物事を「グループ化」するように設計されています。したがって、GroupBoxに代わって使用できるイベントはほとんどありません。
GroupBoxから継承される新しいクラスを作成し、それをサブクラス化して、マウス移動イベントをインターセプトできる場合があります。私が以前に使用した非常に便利なクラスがあり、サブクラス化を実行し、MouseMoveのイベントをトリガーするのは本当に簡単です。
サブクラス化がどのように機能するかを確認するには、ここを見てください...わかりました。VB.NETで記述されていますが、必要に応じてC#に変換するのは非常に簡単です。私が想像するコードは次のようになります。 :
注:私が含めたこのコードは私の頭のてっぺんなので、これにエラーがあるかもしれません...しかし、それがその要点です。
編集:ジョーホワイトのコメントに応えて、私は改訂されたコードを含めました、そしてそれはWM_MOUSEMOVEを送ります...私がVS2008Proの下でこれをどのように再現したかについて以下のステップを見てください。
パブリッククラスMyGroupBox:System.Windows.Forms.GroupBox
{{
プライベートサブクラスsc;
private const int WM_MOUSEMOVE = 0x200;
パブリックデリゲートvoidMyMouseMoveEventHandler(object sender、System.EventArgs e);
パブリックイベントMyMouseMoveEventHandlerMyMouseMove;
public MyGroupBox()
: ベース()
{{
sc = new SubClass(this.Handle、true);
sc.SubClassedWndProc + = new SubClass.SubClassWndProcEventHandler(sc_SubClassedWndProc);
}
保護されたオーバーライドvoidDispose(bool disposed)
{{
if(sc.SubClassed)
{{
sc.SubClassedWndProc-= new SubClass.SubClassWndProcEventHandler(sc_SubClassedWndProc);
sc.SubClassed = false;
}
base.Dispose(disposed);
}
private void OnMyMouseMove()
{{
if(this.MyMouseMove!= null)this.MyMouseMove(this、System.EventArgs.Empty);
}
void sc_SubClassedWndProc(refメッセージm)
{{
if(m.Msg == WM_MOUSEMOVE)this.OnMyMouseMove();
}
}
#regionサブクラス分類ハンドラークラス
パブリッククラスサブクラス:System.Windows.Forms.NativeWindow
{{
パブリックデリゲート無効
SubClassWndProcEventHandler(ref System.Windows.Forms.Message m);
パブリックイベントSubClassWndProcEventHandlerSubClassedWndProc;
private bool IsSubClassed = false;
public SubClass(IntPtr Handle、bool _SubClass)
{{
base.AssignHandle(Handle);
this.IsSubClassed = _SubClass;
}
public bool SubClassed
{{
get {return this.IsSubClassed; }
set {this.IsSubClassed = value; }
}
保護されたオーバーライドvoidWndProc(refメッセージm)
{{
if(this.IsSubClassed)
{{
OnSubClassedWndProc(ref m);
}
base.WndProc(ref m);
}
#regionHiWordメッセージクラッカー
public int HiWord(int Number)
{{
return((Number >> 16)&0xffff);
}
#endregion
#regionLoWordメッセージクラッカー
public int LoWord(int Number)
{{
return(Number&0xffff);
}
#endregion
#regionMakeLongメッセージクラッカー
public int MakeLong(int LoWord、int HiWord)
{{
return(HiWord << 16)| (LoWord&0xffff);
}
#endregion
#regionMakeLParamメッセージクラッカー
public IntPtr MakeLParam(int LoWord、int HiWord)
{{
return(IntPtr)((HiWord << 16)|(LoWord&0xffff));
}
#endregion
private void OnSubClassedWndProc(ref Message m)
{{
if(SubClassedWndProc!= null)
{{
this.SubClassedWndProc(ref m);
}
}
}
#endregion
- 単純な空白のフォームを作成します。
- ツールパレットからグループボックスをドラッグしてフォームにドロップします。デフォルト名は次のようになります。
groupBox1
- フォームのデザイナーコードで、次のようにしてコード参照を変更します。
System.Windows.Forms.GroupBox groupBox1;
にWindowsApplication.MyGroupBox groupBox1;
- メソッド内
InitializeComponent()
で、GroupBoxのインスタンス化を次のように変更します。this.groupBox1 = new WindowsApplication.MyGroupBox();
- 保存してコンパイルするだけです。
MyMouseMove
デザイナウィンドウに戻り、グループボックスをクリックして、プロパティツールボックス内でイベントを探し、接続します。
- イベントハンドラは次のようになります。
private void groupBox1_MyMouseMove(object sender、EventArgs e)
{{
System.Diagnostics.Debug.WriteLine( "MyMouseMove!");
}
アプリケーションを実行すると、グループボックス内でマウスを動かすたびに、「MyMouseMove!」という出力が表示されます。
これがあなたにヒントを与えることを願っています、よろしく、トム。