Я не могу дать вам код, потому что мне нужно было бы потратить некоторое время на разработку точного кода, но у меня есть предложение о том, как вы можете его достичь...
1) Проработайте все элементы управления, на которые потенциально может нажимать мышь. Возможно, вы можете сделать это, вычислив положение мыши относительно всех элементов управления и отыскав пересекающиеся точки.
2) Переберите все потенциальные кандидаты и рассчитайте расстояние между точкой мыши и центральной точкой каждого элемента управления (это может помочь). Правильным управлением будет тот, у которого кратчайшее расстояние
Для этого вам придется хорошенько подумать над математикой!
РЕШЕНИЕ:
Это работает, и я проверил это. Что у меня есть: UserControl, который рисует форму, это называется «ClickControl». Все мои ClickControls находятся внутри Panel
под названием mainPanel
. Для каждого ClickControl зарегистрировано одно и то же событие MouseClick
, в данном случае событие control_MouseClick
. Имея все это в виду, вот пример кода:
void control_MouseClick(object sender, MouseEventArgs e)
{
//get mouse point relative to panel
var mousePoint = panelMain.PointToClient(Cursor.Position);
int startX = mousePoint.X;
int startY = mousePoint.Y;
//store the best match as we find them
ClickControl selected = null;
double? closestDistance = null;
//loop all controls to find the best match
foreach (Control c in panelMain.Controls)
{
ClickControl control = c as ClickControl;
if (control != null)
{
//calculate the center point of the control relative to the parent panel
int endX = control.Location.X + (control.Width / 2);
int endY = control.Location.Y + (control.Height / 2);
//calculate the distance between the center point and the mouse point
double distance = Math.Sqrt(Math.Pow(endX - startX, 2) + Math.Pow(endY - startY, 2));
//if this one is closer then we store this as our best match and look for the next best match
if (closestDistance == null || closestDistance > distance)
{
selected = control;
closestDistance = distance;
}
}
}
//`selected` is now the correct control
}
Я уверен, что есть много оптимизаций, которые можно сделать, если у вас есть проблемы с производительностью, но это, по крайней мере, рабочее начало!
person
musefan
schedule
16.01.2013