我创建了一个类,允许用户在表单上拖动面板。如何确保用户不会将两个面板放在一起?如果他们这样做,我想在它们都重叠时移动/或突出显示其中一个控件。
我尝试在 OnMouseDown 事件中设置它,但效果不太好。
此外,表单上的面板数量取决于表单需要显示的图片数量。每个面板在面板内都有一个图片框。
我创建了一个类,允许用户在表单上拖动面板。如何确保用户不会将两个面板放在一起?如果他们这样做,我想在它们都重叠时移动/或突出显示其中一个控件。
我尝试在 OnMouseDown 事件中设置它,但效果不太好。
此外,表单上的面板数量取决于表单需要显示的图片数量。每个面板在面板内都有一个图片框。
更好的方法是使用 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!
}
}
我希望这会有所帮助,即使您前段时间问过这个问题。
所以我能够在 sgud 的建议的帮助下解决这个问题。
诀窍是在引发的 OnMouseUp 事件中使用 Rectangle.Intersect 方法。
这是我在它背后使用的直觉。(这可能不是最整洁的解决方案)
1)在我的主面板中创建一个所有控件的列表。
2) 遍历控件并为每个控件创建一个包含所有 Rectangle Bounds 的列表。你可以通过 control.Bounds 得到这个
3) 遍历 Bounds 列表并将其与当前活动元素的边界相交。
如果返回的矩形具有与活动控件相同的高度和宽度,则分配更改背景颜色属性。
我希望这对其他有类似问题的人有所帮助