Как получить контроль над курсором мыши? [Дубликат]

17

У меня есть форма с несколькими кнопками, и я хочу знать, какая кнопка находится под курсором.

P.S. Возможно, это дубликат, но я не могу найти ответ на этот вопрос.

    
задан Poma 09.03.2010 в 18:28
источник

5 ответов

25

Посмотрите GetChildAtPoint . Вам нужно будет выполнить дополнительную работу, если элементы управления содержатся в контейнере, см. ответ дан Philip Fourie 09.03.2010 в 18:34

источник
  • Вот и все! Спасибо! –  Poma 09.03.2010 в 18:38
  • +1 для Control.PointToClient –  Rafik Bari 14.02.2013 в 22:39
13

Возможно, GetChildAtPoint и PointToClient - первая идея для большинства людей. Я также использовал его в первую очередь. Но GetChildAtPoint не работает должным образом с невидимыми или перекрывающимися элементами управления. Вот мой хорошо работающий код, и он управляет этими ситуациями.

using System.Drawing;
using System.Windows.Forms;

public static Control FindControlAtPoint(Control container, Point pos)
{
    Control child;
    foreach (Control c in container.Controls)
    {
        if (c.Visible && c.Bounds.Contains(pos))
        {
            child = FindControlAtPoint(c, new Point(pos.X - c.Left, pos.Y - c.Top));
            if (child == null) return c;
            else return child;
        }
    }
    return null;
}

public static Control FindControlAtCursor(Form form)
{
    Point pos = Cursor.Position;
    if (form.Bounds.Contains(pos))
        return FindControlAtPoint(form, form.PointToClient(pos));
    return null;
}

Это даст вам право управления под курсором.

    
ответ дан Wisebee 14.05.2013 в 14:34
источник
2
// This getYoungestChildUnderMouse(Control) method will recursively navigate a       
// control tree and return the deepest non-container control found under the cursor.
// It will return null if there is no control under the mouse (the mouse is off the
// form, or in an empty area of the form).
// For example, this statement would output the name of the control under the mouse
// pointer (assuming it is in some method of Windows.Form class):
// 
// Console.Writeline(ControlNavigatorHelper.getYoungestChildUnderMouseControl(this).Name);


    public class ControlNavigationHelper
    {
        public static Control getYoungestChildUnderMouse(Control topControl)
        {
            return ControlNavigationHelper.getYoungestChildAtDesktopPoint(topControl, System.Windows.Forms.Cursor.Position);
        }

        private static Control getYoungestChildAtDesktopPoint(Control topControl, System.Drawing.Point desktopPoint)
        {
            Control foundControl = topControl.GetChildAtPoint(topControl.PointToClient(desktopPoint));
            if ((foundControl != null) && (foundControl.HasChildren))
                return getYoungestChildAtDesktopPoint(foundControl, desktopPoint);
            else
                return foundControl;
        }
    }
    
ответ дан Peter B. Nelson 03.11.2011 в 22:22
источник
1

Что касается определения события on-Mouse-over в каждой кнопке который присваивает кнопку отправителя общедоступной переменной типа кнопки

    
ответ дан Radian 09.03.2010 в 18:32
источник
  • На самом деле я не кнопки, это сторонние плагины;) –  Poma 09.03.2010 в 18:35
1

Вы можете сделать это несколькими способами:

  1. Прослушайте событие MouseEnter элементов управления формы. Параметр «отправитель» сообщит вам, какой элемент управления поднял событие.

  2. Получить позицию курсора, используя System.Windows.Forms.Cursor.Location , и сопоставить ее с координатами вашей формы, используя Form.PointToClient() . Затем вы можете передать точку Form.GetChildAtPoint() , чтобы найти элемент управления под этой точкой.

Эндрю

    
ответ дан Andrew 09.03.2010 в 18:34
источник