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

Var*_*ave 8 c# panel mouseevent winforms

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

我尝试在OnMouseDown事件中设置它,但这不是很有效.

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

Cod*_*n64 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!
   }
}
Run Code Online (Sandbox Code Playgroud)

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


Var*_*ave 1

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

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

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

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

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

3) 遍历边界列表并将其与当前活动元素的边界相交。
如果返回的矩形的高度和宽度与活动控件相同,则分配更改背景颜色属性。

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