2011-04-11 49 views
0

什么是最简单的确定当前光标位置是否超过特定(WinForm)控件的方法?WinForm控件上的光标(c#,WinForm 4.0)

我可以 - 当然 - 计算控件的位置,然后检查光标位置是否在此rectangel内。但是,也许有已经存在这个东西....

不能使用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); 
    } 

什么 - 从今天开始 - 请参见下面的我使用此刻的扩展方法...

回答

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); 
    } 
3

你可以声明:

bool insideMyControl = false; 

然后陷阱的MouseEnter(并设置insideMyControl =真)和鼠标离开事件(和设置insideMyControl =假)的特定控制。
然后在你的事件里面看看MyControl的值。

+0

打我给它 - 我会说同样的事情:) – 2011-04-11 11:00:13

+0

@Jackson教宗:今天早上发生在我身上三次:) – Marco 2011-04-11 11:02:04

+0

这几乎是一个实时的答案 - 谢谢。这种方法的一个问题是,我需要在同一控制的另一个事件中确定位置。不幸的是,事件的顺序是非确定性的。所以可能会发生MouseLeave事件稍后处理(即使只是很短的时间),并且结果尚不可用。 – 2011-04-11 11:05:39

0

你有没有试过GetCursorPos Win32 API函数

试试这个。

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

感谢您的反馈,问题更多的是要确定光标位置是否“超过”我的控制。既然有办法获得“相对”职位,这很容易确定。对我来说关键是方法control.PointToClient – 2011-04-12 15:30:11