组框是一个静态控件,其中包含其他控件。如果布局正确,它纯粹是为了将事物“组合”在一起以使用户界面直观。因此,您可以代表 GroupBox 使用的事件很少。
您可以创建一个从 GroupBox 继承的新类并将其子类化以拦截鼠标移动事件。我以前使用过一个非常有用的类,它非常容易执行子类化并触发 MouseMove 事件。
看看这个here,看看子类化是如何工作的......好吧,它是用VB.NET编写的,但是如果你愿意的话,把它翻译成C#真的很容易,我想象的代码看起来像这样:
注意:我包含的这段代码是我的头等大事,所以这可能有一个错误......但这就是它的要点。
编辑:作为对 Joe White 评论的回应,我已经包含了修改后的代码,它确实发送了 WM_MOUSEMOVE ......看看下面的步骤,了解我如何在 VS 2008 Pro 下复制它。
公共类 MyGroupBox : System.Windows.Forms.GroupBox
{
私有子类 sc;
私有常量 int WM_MOUSEMOVE = 0x200;
公共委托无效 MyMouseMoveEventHandler(对象发送者,System.EventArgs e);
公共事件 MyMouseMoveEventHandler MyMouseMove;
公共 MyGroupBox()
: 根据()
{
sc = new SubClass(this.Handle, true);
sc.SubClassedWndProc += new SubClass.SubClassWndProcEventHandler(sc_SubClassedWndProc);
}
受保护的覆盖无效处置(布尔处置)
{
如果(sc.SubClassed)
{
sc.SubClassedWndProc -= 新的 SubClass.SubClassWndProcEventHandler(sc_SubClassedWndProc);
sc.SubClassed = 假;
}
base.Dispose(处置);
}
私人无效 OnMyMouseMove()
{
if (this.MyMouseMove != null) this.MyMouseMove(this, System.EventArgs.Empty);
}
void sc_SubClassedWndProc(参考消息 m)
{
if (m.Msg == WM_MOUSEMOVE) this.OnMyMouseMove();
}
}
#region SubClass 类处理程序类
公共类子类:System.Windows.Forms.NativeWindow
{
公共代表无效
SubClassWndProcEventHandler(参考 System.Windows.Forms.Message m);
公共事件 SubClassWndProcEventHandler SubClassedWndProc;
私有布尔 IsSubClassed = false;
公共子类(IntPtr 句柄,布尔 _SubClass)
{
base.AssignHandle(句柄);
this.IsSubClassed = _SubClass;
}
公共布尔子类
{
得到 { 返回 this.IsSubClassed; }
设置 { this.IsSubClassed = value; }
}
受保护的覆盖无效 WndProc(参考消息 m)
{
如果(this.IsSubClassed)
{
OnSubClassedWndProc(参考 m);
}
base.WndProc(参考 m);
}
#region HiWord 消息破解器
public int HiWord(int Number)
{
返回 ((数字 >> 16) & 0xffff);
}
#endregion
#region LoWord 消息破解器
公共 int LoWord(int Number)
{
返回(数字和 0xffff);
}
#endregion
#region MakeLong 消息破解器
公共 int MakeLong(int LoWord, int HiWord)
{
返回 (HiWord << 16) | (低字 & 0xffff);
}
#endregion
#region MakeLParam 消息破解器
公共 IntPtr MakeLParam(int LoWord,int HiWord)
{
返回 (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
}
#endregion
私人无效 OnSubClassedWndProc(参考消息 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
在属性工具箱中查找事件,然后将其连接起来。
- 您的事件处理程序应如下所示:
私人无效组框1_MyMouseMove(对象发送者,EventArgs e)
{
System.Diagnostics.Debug.WriteLine("MyMouseMove!");
}
运行应用程序,每次在组框内移动鼠标时,您都会看到输出“MyMouseMove!”。
希望这能给你提示,最好的问候,汤姆。