WinForm控件上的光标(c#,WinForm 4.0)

时间:2011-04-11 10:54:35

标签: winforms c#-4.0

确定当前光标位置是否超过特定(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 个答案:

答案 0 :(得分:3)

您可以声明:

bool insideMyControl = false;

然后在特定控件上捕获MouseEnter(并设置insideMyControl = true)和MouseLeave事件(并设置insideMyControl = false)。
然后在你的事件中查看insideMyControl值。

答案 1 :(得分:0)

您是否尝试过GetCursorPos WIN32 API函数

试试这个。

Point p = new Point();
GetCursorPos(ref p);

答案 2 :(得分:0)

这是我迄今为止找到的最佳解决方案。实际上它很容易(一旦你知道如何做它;-)因为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);
    }