Курсор над элементом управления WinForm (c #, WinForm 4.0) - PullRequest
0 голосов
/ 11 апреля 2011

Каков самый простой способ определить, находится ли моя текущая позиция курсора над определенным (WinForm) элементом управления?

Я могу - конечно - рассчитать положение элемента управления и затем проверить,позиция курсора находится внутри этого прямоугольника.Но, возможно, что-то уже существует для этого ...

Я не могу использовать для этого событие OnMouseOver, поскольку решения должны приниматься в рамках (другого) события.Для более подробного объяснения вот что я делаю (в псевдокоде).Проблема заключается в том, что когда я запускаю событие перетаскивания, затем перехожу к другому элементу управления (за пределами этого), отпускаю мышь, чтобы завершить удаление, контекстное меню отображается на «неправильном» элементе управления (цель удаления).Это то, чего я хочу избежать ....

 private void TableControlMouseDown(object sender, MouseEventArgs e)
    {
        ...
        // this is a User control with some sub controls 

        // when selected start drag and drop
        if (SOMEConditions)
        {
            // start drag and drop operation
            DragAndDropWrapper dragAndDropWrapper = new DragAndDropWrapper(this.ObjectsToDrag, this);
            this._subControl.DoDragDrop(dragAndDropWrapper, DragDropEffects.Copy);
        }

        // context menu

        // check should go here
        // something like "is pt still over "this" or over the drag target ...
        Point pt = this._subControl.PointToClient(Control.MousePosition);
        this._myContextMenu.Show(this._subControl, pt);
    }

- на сегодняшний день - см. Ниже метод расширения, который я использую в данный момент ...

Ответы [ 3 ]

3 голосов
/ 11 апреля 2011

Вы можете объявить:

bool insideMyControl = false;

Затем перехватить события MouseEnter (и установить insideMyControl = true) и MouseLeave (и установить insideMyControl = false) для конкретного элемента управления.Тогда в вашем событии посмотрите значение insideMyControl.

0 голосов
/ 12 апреля 2011

Это лучшее решение, которое я нашел до сих пор.На самом деле это довольно легко (как всегда, когда вы знаете, как это сделать ;-), поскольку PointToClient дает мне относительные координаты, которые резко сокращают усилия .... Как расширениеМетод также прост в использовании со всеми элементами управления.

    /// <summary>
    ///   Is the mouse pointer over the control?
    /// </summary>
    /// <param name = "control"></param>
    /// <returns></returns>
    public static bool IsMouseOverControl(this Control control)
    {
        if (control == null) throw new ArgumentNullException("control");
        Contract.EndContractBlock();

        Point pt = control.PointToClient(Control.MousePosition);
        return (pt.X >= 0 && pt.Y >= 0 && pt.X <= control.Width && pt.Y <= control.Height);
    }
0 голосов
/ 11 апреля 2011

Вы пробовали GetCursorPos Функция API WIN32

Попробуйте это.

Point p = new Point();
GetCursorPos(ref p);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...