組合框是一個靜態控件,它內部包含其他控件。它的設計純粹是爲了將用戶界面「分組」在一起,以使用戶界面直觀,如果佈局正確。因此,您可以代表GroupBox使用很少的事件。
您可能可以創建一個從GroupBox繼承的新類並將其繼承以攔截鼠標移動事件。有一個我以前使用過的非常有用的類,它很容易執行子類併爲MouseMove觸發事件。
看看這個here看看子類是如何工作的......好吧,它是用VB.NET編寫的,但是如果你願意,它可以很容易地轉換成C#,我想象的代碼看起來是這樣的:
注:我已經包含的這段代碼是我的頭頂,所以可能會有錯誤在這...但這是它的要點。
編輯:針對喬·懷特的評論,我已經包含了修改後的代碼,它併發送WM_MOUSEMOVE ......看看下面的臺階上我怎麼轉載此2008專業VS之下。
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!「。
希望這給你提示, 最好的問候, 湯姆。
我很懷疑,因爲其他的反應證實了'WM_MOUSEMOVE'甚至從未被髮送到組框。你有沒有測試過,看看這段代碼是否可以用GroupBox工作? –
@Joe White:請參閱我修改後的代碼以及我用於使其工作的步驟。 HTH。最好的問候,湯姆。 – t0mm13b