【问题标题】:Capturing the mouse捕获鼠标
【发布时间】:2010-12-26 02:23:39
【问题描述】:

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

【问题讨论】:

  • 您好,当您说“渲染”时,您的意思是矩形是由Paint Event 在Panel 中绘制的吗?还是它们是某种类型的“对象”?矩形的大小是固定的,还是可以重新调整大小或移动……如果是对象?我们可以假设矩形不重叠吗?你越清楚,你得到的答案就越清楚:)

标签: c# mouseover


【解决方案1】:

这似乎对 Reactive LINQ 或 Rx 很有用,但我更熟悉使用前者。

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

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

这可能会影响性能。

【讨论】:

  • 感谢您的链接!那是非常“遥远”的 C# 编程!
  • @BillW - 使用 Reactive LINQ 的一个优点是您可以确定方向的斜率,并预测接下来将命中哪个矩形,以提高性能。
  • @James 谢谢。恕我直言,“坡度”的计算(预测)是否有用将取决于特定的使用场景:ui的目的,最终用户可能进行的模态活动。恕我直言,在这个特殊的问题中,我们还不够了解 OP 的意图/设计/用例是什么。但是,我觉得你的评论很有趣,我很感激。我还没有从 WinForms“跳船”到 WPF,但承认被 WPF 更强大的事件控制功能(冒泡和广播)所吸引。另一方面,我发现 C# 和 XAML 之间往返的想法很奇怪:)
【解决方案2】:

不要对矩形使用控件,它们非常昂贵且不能重叠。您不能仅使用 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);
  }

【讨论】:

  • 感谢您的帮助。确实很有帮助。
【解决方案3】:

您可以创建一个控件,其中包含两个矩形。外部矩形的 OnMouseMove 将被暴露。外部矩形将是不可见的。这样一来,您就可以让 Windows 管理事件调用,而不会产生混乱的代码。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我正在考虑使用/继承 Control。但是,有性能方面的考虑。首先,这个 GUI 需要尽可能的轻量级。我正在创建可重复使用的面板和尽可能少的控件(按钮等)。根据 MS 的说法,尽可能多地使用 GDI+ 将大大提高性能。我需要为真正重要的地方保留资源 - 我已经计划实施近乎实时的网络通信监控和资源昂贵的网络服务器应用程序。
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2011-10-08
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多