我在我的窗體中有一個面板,帶有單擊事件處理程序。我還在面板中有一些其他控件(標籤,其他面板等)。如果您點擊面板內的任何位置,我希望點擊事件可以註冊。只要我不點擊面板內的任何控件,點擊事件就會發揮作用,但無論您在面板內點擊哪個位置,我都想要觸發該事件。這可能沒有添加相同的點擊事件面板內的所有控件?在C中的面板內的任何地方處理單擊事件#
回答
您曾經能夠覆蓋控件上的OnBubbleEvent方法。在WPF的機制被稱爲路由事件:http://weblogs.asp.net/vblasberg/archive/2010/03/30/wpf-routed-events-bubbling-several-layers-up.aspx
我需要完全相同的功能的今天,所以這是測試和工程:
1:創建一個subclasser可以搶奪你的鼠標點擊:
internal class MessageSnatcher : NativeWindow
{
public event EventHandler LeftMouseClickOccured = delegate{};
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_PARENTNOTIFY = 0x210;
private readonly Control _control;
public MessageSnatcher(Control control)
{
if (control.Handle != IntPtr.Zero)
AssignHandle(control.Handle);
else
control.HandleCreated += OnHandleCreated;
control.HandleDestroyed += OnHandleDestroyed;
_control = control;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_PARENTNOTIFY)
{
if (m.WParam.ToInt64() == WM_LBUTTONDOWN)
LeftMouseClickOccured(this, EventArgs.Empty);
}
base.WndProc(ref m);
}
private void OnHandleCreated(object sender, EventArgs e)
{
AssignHandle(_control.Handle);
}
private void OnHandleDestroyed(object sender, EventArgs e)
{
ReleaseHandle();
}
}
2:初始化綁架者掛接到面板的WndProc:
private MessageSnatcher _snatcher;
public Form1()
{
InitializeComponent();
_snatcher = new MessageSnatcher(this.panel1);
}
3:消息的綁架者將得到WM_PARENTNOTIFY如果你點擊一個卡ld控制。
從技術上講它是可能的,雖然它是非常難看醜。您需要在之前收到消息,並將其發送給點擊的控件。您可以使用IMessageFilter執行哪些操作,您可以嗅探在調度之前從消息隊列中刪除的輸入消息。就像這樣:
using System;
using System.Drawing;
using System.Windows.Forms;
class MyPanel : Panel, IMessageFilter {
public MyPanel() {
Application.AddMessageFilter(this);
}
protected override void Dispose(bool disposing) {
if (disposing) Application.RemoveMessageFilter(this);
base.Dispose(disposing);
}
public bool PreFilterMessage(ref Message m) {
if (m.HWnd == this.Handle) {
if (m.Msg == 0x201) { // Trap WM_LBUTTONDOWN
Point pos = new Point(m.LParam.ToInt32());
// Do something with this, return true if the control shouldn't see it
//...
// return true
}
}
return false;
}
}
+1我也做了這個,並同意它應該很好地工作。我唯一的警告是,它基本上附加到應用程序事件消息泵,因此請確保無論您在「對此執行任何操作......」位中做什麼,都要快速高效地進行。 – 2010-10-13 19:46:32
呃,它已經過濾面板和消息。此代碼在人類運行。 – 2010-10-13 19:57:31
位遲到了,但我所做的就是映射所有控件的所有點擊事件的面板,面板中單擊事件的內部。我知道它討厭的做法。但嘿!
- 1. 使事件的任何面板c#
- 2. 添加事件處理動態地控制面板內
- 3. 處理DataGridHyperlinkColumn單擊事件
- 4. 如何在菜單的點擊事件中顯示面板?
- 5. 處理多個懸停以單擊C#中kinect的事件
- 6. 的JavaScript單擊事件處理
- 7. jQuery的單擊事件處理
- 8. 與變量處理中單擊事件
- 9. C#事件處理方法
- 10. Java中的事件處理與C#中的事件處理
- 11. 處理菜單項單擊事件 - Android
- 12. 在C++中處理事件
- 13. 在C#中處理事件#
- 14. 如何處理我的類中的單擊事件
- 15. 文件字段不能正常工作在面板中單擊任何地方是開放的ExtJS的4.2
- 16. 多個控件單擊由一個事件處理的事件
- 17. 如何處理jQuery網格中的行單擊事件
- 18. 如何處理WPF中的TabItem單擊事件?
- 19. 如何處理jquery中的單擊事件
- 20. 如何處理vb.net中單個地方的所有類型對象的單擊事件?
- 21. 在C#中的ListBox項目上處理雙擊事件
- 22. Click事件上的任何地方文件射擊,
- 23. 如何處理按鈕在jQuery中單擊事件?
- 24. 如何在KnockoutJs單擊事件處理程序中使用event.preventDefault?
- 25. 在C++中的NSButton事件處理
- 26. 複選框並單擊事件處理
- 27. 單擊GWT/MGWT中的面板時要執行的事件
- 28. 處理右鍵單擊/左鍵單擊c中的任務欄按鈕#
- 29. 如何獲取面板內點擊事件的座標?
- 30. 確定MouseListener中單擊的JPanel組件。事件處理
這是WPF .....? – 2010-10-13 18:21:12
不,只是一個普通的Windows窗體應用程序 – 2010-10-13 18:26:11