当控件重叠时,如何确保单击正确的控件?

时间:2013-01-16 14:36:53

标签: c# controls transparent overlapping

我在表单上创建了许多透明控件,每个控件都显示一个十六进制形状,它们被分组为一个映射,因此这些渐变是边对边的。当然,每个十六进制包含在一个方形控件中,因此它们与每个相邻的十六进制重叠。我希望能够在十六进制内部单击以使其突出显示。但是,除非我在没有重叠的十六进制中间点击,否则根据控件的堆栈顺序,点击事件将由顶部的任何控件拾取,而不一定是我想要的控件。所以我看到它,我需要做两件事:

  1. 我需要确保光标位于十六进制形状内(每个十六进制的边缘之间有一个小间隙)。因此,如果我单击控件的一个角落,该控件将不会响应该点击,因为它位于十六进制的外部。
  2. 当我点击时,我需要确定哪个控件拥有我点击的十六进制。

1 个答案:

答案 0 :(得分:2)

我无法给你代码,因为我需要花一些时间来处理确切的代码,但我确实建议你如何实现它......

1)计算出鼠标可能点击的所有控件。也许你可以通过计算相对于所有控件的鼠标位置并寻找重叠点

来做到这一点

2)迭代所有潜在候选者并计算鼠标点与每个对照的中心点之间的距离(this might help)。正确的控制将是距离最短的控制

你需要把数学放在这个上面!


解决方案:

这有效,我已经测试过了。我拥有:绘制形状的UserControl,称为“ClickControl”。我的所有ClickControl都位于名为Panel的{​​{1}}内。每个ClickControl都向其注册了相同的mainPanel事件,在本例中为MouseClick事件。考虑到所有这些,这里是示例代码:

control_MouseClick

我确信如果您遇到性能问题,可以进行大量优化,但这至少是一个有效的开始!