如何检查两个控件在Windows窗体中是否重叠

时间:2012-12-17 15:58:17

标签: c# winforms mouseevent panel

我创建了一个允许用户拖动表单上的面板的类。我该如何保证? 用户不会将两个面板放在一起?如果他们这样做,我想在它们重叠时移动/或突出显示其中一个控件。

我尝试在OnMouseDown事件中设置它,但这不太有用。

此外,表单上的面板数量取决于表单需要显示的图片数量。每个面板在面板内都有一个图片框。

2 个答案:

答案 0 :(得分:7)

更好的方法是使用Rectangle.Bounds.IntersectsWith方法,它会为您进行检查并生成更清晰的代码。我个人并不知道任何性能问题或好处,不管怎么说,虽然我猜想只需循环控件并用它来检查它们比构建列表和循环更快。

Picturebox pic = new Picturebox();
foreach(Control picturebox in Form1){
   if (pic.Bounds.IntersectsWith(picturebox.Bounds))
   {
       //We have a problem, Houston, because we just collided!
   }
}

我希望这会有所帮助,即使你前一段时间问过这个问题。

答案 1 :(得分:1)

所以我能够在sgud的建议的帮助下解决这个问题。

诀窍是在OnMouseUp事件中使用Rectangle.Intersect方法。

这是我背后使用的直觉。 (它可能不是最好的解决方案)

1)创建主面板中所有控件的列表。

2)遍历控件并为每个控件创建所有矩形边界的列表。你可以通过control.Bounds获得这个。

3)浏览Bounds列表并将其与当前活动元素的界限相交 如果返回的矩形的高度和宽度与活动控件相同,则指定更改背面颜色属性。

我希望这对其他有类似问题的人有帮助