GroupBox是一个静态控件,用于容纳其他控件。它的设计纯粹是为了将事物“分组”,如果正确布局,则可以使用户界面直观易懂。因此,你可以使用的事件非常少。
您可以创建一个新类,该类继承自GroupBox并对其进行子类化以拦截鼠标移动事件。我之前使用过一个非常有用的类,它真的很容易执行子类化并触发MouseMove事件。
请查看这里,了解子类化如何工作...好吧,它是用VB.NET编写的,但是如果您愿意,将其翻译成C#非常容易,我想代码看起来像这样:
注意:我包含的此代码是我脑海中的顶部,因此其中可能会有错误...但这就是要点。
编辑:针对Joe White的评论,我已经包含了修订后的代码,并且确实发送了WM_MOUSEMOVE...请查看下面的步骤,了解我在VS 2008 Pro下如何重现此问题。
public class MyGroupBox : System.Windows.Forms.GroupBox
{
private SubClass sc;
private const int WM_MOUSEMOVE = 0x200;
public delegate void MyMouseMoveEventHandler(object sender, System.EventArgs e);
public event MyMouseMoveEventHandler MyMouseMove;
public MyGroupBox()
: base()
{
sc = new SubClass(this.Handle, true);
sc.SubClassedWndProc += new SubClass.SubClassWndProcEventHandler(sc_SubClassedWndProc);
}
protected override void Dispose(bool disposing)
{
if (sc.SubClassed)
{
sc.SubClassedWndProc -= new SubClass.SubClassWndProcEventHandler(sc_SubClassedWndProc);
sc.SubClassed = false;
}
base.Dispose(disposing);
}
private void OnMyMouseMove()
{
if (this.MyMouseMove != null) this.MyMouseMove(this, System.EventArgs.Empty);
}
void sc_SubClassedWndProc(ref Message m)
{
if (m.Msg == WM_MOUSEMOVE) this.OnMyMouseMove();
}
}
#region SubClass Classing Handler Class
public class SubClass : System.Windows.Forms.NativeWindow
{
public delegate void
SubClassWndProcEventHandler(ref System.Windows.Forms.Message m);
public event SubClassWndProcEventHandler SubClassedWndProc;
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; }
}
protected override void WndProc(ref Message m)
{
if (this.IsSubClassed)
{
OnSubClassedWndProc(ref m);
}
base.WndProc(ref m);
}
#region HiWord Message Cracker
public int HiWord(int Number)
{
return ((Number >> 16) & 0xffff);
}
#endregion
#region LoWord Message Cracker
public int LoWord(int Number)
{
return (Number & 0xffff);
}
#endregion
#region MakeLong Message Cracker
public int MakeLong(int LoWord, int HiWord)
{
return (HiWord << 16) | (LoWord & 0xffff);
}
#endregion
#region MakeLParam Message Cracker
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!”。
希望这给你提示,
最好的问候,
汤姆。