当前位置: 首页 > 编程语言 > C#

在C#中的面板内的任何位置处理click事件分享

时间:2023-04-10 19:31:04 C#

C#LearningTutorial:HandleaclickeventanywhereinapanelinsideapanelinsideinC#我在面板内还有一些其他控件(标签、其他面板等)。如果您单击面板内的任意位置,我希望注册单击事件。只要我不单击面板内的任何控件,单击事件就会起作用,但无论您在面板内单击什么,我都希望事件触发。如果不向面板内的所有控件添加相同的点击事件,这是否可能?从技术上讲,这是可能的,尽管它很丑陋。您需要在将消息发送到单击的控件之前捕获该消息。您可以使用IMessageFilter执行此操作,您可以在其中嗅探在分派之前从消息队列中删除的输入消息。像这样:使用系统;使用系统绘图;使用System.Windows.Forms;类MyPanel:面板,IMessageFilter{publicMyPanel(){Application.AddMessageFilter(this);}protectedoverridevoidDispose(booldisposing){if(disposing)Application.RemoveMessageFilter(this);base.Dispose(处置);}publicboolPreFilterMessage(refMessagem){if(m.HWnd==this.Handle){if(m.Msg==0x201){//陷阱WM_LBUTTONDOWNPointpos=newPoint(m.LParam.ToInt32());//对此做一些事情,如果控件不应该看到它则返回true//...//returntrue}}returnfalse;我今天需要完全相同的功能,因此经过测试和工作:1:创建一个抓取鼠标点击的子抓取器:internalclassMessageSnatcher:NativeWindow{publiceventEventHandlerLeftMouseClickOccured=delegate{};私人常量intWM_LBUTTONDOWN=0x201;私人常量intWM_PARENTNOTIFY=0x210;私有只读控制_control;publicMessageSnatcher(Controlcontrol){if(control.Handle!=IntPtr.Zero)AssignHandle(control.处理);elsecontrol.HandleCreated+=OnHandleCreated;control.HandleDestroyed+=OnHandleDestroyed;_control=控制;}protectedoverridevoidWndProc(refMessagem){if(m.Msg==WM_PARENTNOTIFY){if(m.WParam.ToInt64()==WM_LBUTTONDOWN)LeftMouseClickOccured(this,EventArgs.Empty);}base.WndProc(refm);}privatevoidOnHandleCreated(objectsender,EventArgse){AssignHandle(_control.Handle);}privatevoidOnHandleDestroyed(object,EventArgse){ReleaseHandle();}}2:初始化捕手挂接到面板WndProc:privateMessageSnatcher_snatcher;publicForm1(){InitializeComponent();_snatcher=newMessageSnatcher(this.panel1);}3:如果单击子控件,Messagesnatcher将获得WM_PARENTNOTIFY您过去可以重写控件上的OnBubbleEvent方法。在WPF中,该机制称为路由事件:http://weblogs.asp.net/vblasberg/archive/2010/03/30/wpf-routed-events-bubbling-several-layers-up.aspx迟到派对,但是我所做的是将面板内所有控件的所有点击事件映射到面板点击事件。我知道它令人讨厌的做法。但是,嘿!以上就是C#学习教程:HandlingtheclickeventinthepanelanywhereinC#分享的所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——这篇文章整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: