捕获鼠标

时间:2009-12-13 01:08:43

标签: c# mouseover

我有一个List<Rectangle> myRectangles在Panel控件中呈现。如果我想在鼠标位于任何myRectangles内时触发事件处理程序,那么我最好选择“foreach”吗?然后去做任何myRectangle.OnMouseMove()会做什么?

4 个答案:

答案 0 :(得分:2)

这似乎是Reactive LINQ或Rx的一个很好的用途,但我对使用前者更熟悉。

http://tomasp.net/blog/reactive-ii-csevents.aspx

您需要优化以确定哪些矩形可能会相交,但只需使用OnMouseMove,然后在LINQ查询中,您将找到输入的任何矩形。

这可能会让人感到害怕。

答案 1 :(得分:1)

不要对矩形使用控件,它们非常昂贵且不能重叠。仅使用OnMouseMove()方法无法使其可靠,当用户快速移动鼠标和/或矩形边缘靠近面板边框时,您将错过鼠标移动到面板外部。使用Control.Capture属性可以轻松解决此问题。一些示例代码:

  public event EventHandler InsideRectangles;
  private List<Rectangle> mRectangles = new List<Rectangle>();
  private bool mInside;

  protected void OnInsideRectangles(EventArgs e) {
    EventHandler handler = InsideRectangles;
    if (handler != null) handler(this, e);
  }

  protected override void OnMouseMove(MouseEventArgs e) {
    bool inside = false;
    foreach (var rc in mRectangles) {
      if (rc.Contains(e.Location)) {
        inside = true;
        break;
      }
    }
    if (inside && !mInside) OnInsideRectangles(EventArgs.Empty);
    this.Capture = inside;
    mInside = inside;
    base.OnMouseMove(e);
  }

答案 2 :(得分:0)

您可以创建一个控件,其中一个在另一个内部有一个矩形。外部矩形的OnMouseMove将被暴露。外部矩形将是不可见的。通过这种方式,您可以让Windows管理事件调用,而不会出现混乱的代码。

答案 3 :(得分:0)

我假设您必须使用Winforms?如果是这样,您可能需要考虑使矩形分离子控件(渲染OnPaint中的矩形)并使用Control提供的鼠标事件。