C# 点击测试Windows窗体图形

C# 点击测试Windows窗体图形,c#,winforms,graphics,gdi+,hittest,C#,Winforms,Graphics,Gdi+,Hittest,我需要为我的Windows窗体控件实现命中测试。我有一个自定义类,它继承了控件类,并在OnPaint方法中绘制了一条多段线: e.Graphics.DrawLines(myPen, myPoints); 现在,在MouseDown事件中,我得到了鼠标的位置,并执行了如下命中测试: using (var path = new GraphicsPath()) { path.AddLines(myPoints); return path.IsVisible(pt); } 问题在于,

我需要为我的Windows窗体控件实现命中测试。我有一个自定义类,它继承了
控件
类,并在
OnPaint
方法中绘制了一条多段线:

e.Graphics.DrawLines(myPen, myPoints);
现在,在
MouseDown
事件中,我得到了鼠标的位置,并执行了如下命中测试:

using (var path = new GraphicsPath())
{  
   path.AddLines(myPoints);
   return path.IsVisible(pt);
}
问题在于,例如,如果图中有多段线(看起来可能像多边形),
IsVisible
方法返回true,即使我在表示该多边形的区域内单击:

我需要一个不同的行为,只有在我点击该行时,该方法才必须返回true。
我该怎么做?

您只需要使用不同的命中测试方法:
IsOutlineVisible
而不是
IsVisible

using (var path = new GraphicsPath())
{  
   path.AddLines(myPoints);
   return path.IsOutlineVisible(pt, Pens.Black);
}

您需要提供笔,因为基于行的命中测试使用行,并且行可以具有特定的宽度。也就是说,我建议使用与绘图不同(更厚)的笔,因为对于许多用户来说,用鼠标拾取单个像素并不容易。

更好的解决方案是创建一个对象/一个表示您想要的形状的模型,它可以自己绘制。然后,对象将负责检查它是否被击中(在哪个区域),而不是主程序。在主应用程序中,您只需为每个要检查的对象传递鼠标坐标即可。@pasty谢谢您的建议,实际上我正在按照您所说的做。这个问题只是一个简单的例子。@Nick正如我在文章中所说的,您只需要将
IsVisible
替换为
IsOutlineVisible