确定当前光标位置是否超过特定(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);
}
- 截至今日 - 请参阅下面我正在使用的扩展方法......
答案 0 :(得分:3)
您可以声明:
bool insideMyControl = false;
然后在特定控件上捕获MouseEnter(并设置insideMyControl = true)和MouseLeave事件(并设置insideMyControl = false)。
然后在你的事件中查看insideMyControl值。
答案 1 :(得分:0)
答案 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);
}