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

将子控件的MouseMove事件无缝转发给父级分享

时间:2023-04-10 17:00:20 C#

将子控件的MouseMove事件无缝转发给父级我有一个使用GDI+绘制的自定义UserControl。它是一个透明控件,可在父控件之上绘制小形状。所有父窗口都创建该控件,为其绘制一个矩形以在其中绘制自身,然后在用户单击非透明区域时接收事件。绘图部分工作正常,但现在我需要做的是尽可能无缝地将所有MouseMove、MouseClick等事件转发到父控件,如果这些事件发生在形状之外。使用GraphicsPath绘制形状,我已经能够使用GraphicsPath.IsVisible()检测鼠标位置是否在形状上。我想以一种在父级上需要零或最少额外代码的方式来做到这一点。父级不一定知道MouseMove事件是否从子控件转发过来,它应该平等对待它们。我是否必须使用pinvoke/SendMessage()来执行此操作?或者是否有更简单的方法使用.NET框架?这在winapi中是可能的,窗口管理器发送WM_NCHITTEST消息询问鼠标悬停在控件的哪一部分上。您可以做的是返回HTTRANSPARENT,它会询问父窗口。下面是实现此功能的示例UserControl。捕获消息需要覆盖WndProc():publicpartialclassUserControl1:UserControl{publicUserControl1(){InitializeComponent();路径=新列表();GraphicsPath示例=newGraphicsPath();example.AddEllipse(新矩形(10,10,50,30));路径。添加(示例);}列出路径;protectedoverridevoidOnPaint(PaintEventArgse){foreach(varpathinpaths)e.Graphics.FillPath(Brushes.Blue,path);base.OnPaint(e);}protectedoverridevoidWndProc(refMessagem){base.WndProc(refm);//在客户区捕获WM_NCHITTESTif(m.Msg==0x84&&m.Result==(IntPtr)1){Pointpos=newPoint(m.LParam.ToInt32());pos=this.PointToClient(pos);booloncurve=false;foreach(varpathinpaths)if(path.IsVisible(pos))oncurve=true;如果(!oncurve)m.Result=(IntPtr)(-1);//HTTRANSPARENT}}}测试代码形式如下:以上是C#学习教程:无缝转发子控件MouseMove事件到父共享,如果对你有用还需要进一步了解C#学习教程,希望大家多多关注—privatevoiduserControl11_MouseMove(objectsender,MouseEventArgse){Console.WriteLine("在形状{0}",e.Location);}privatevoidForm1_MouseMove(objectsender,MouseEventArgse){Console.WriteLine("Onform{0}",e.Location);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: