0

List<Rectangle> myRectanglesPanel コントロールでレンダリングされる があります。マウスがいずれかの myRectangles 内にあるときにイベント ハンドラーを起動したい場合、'foreach' を実行するのが最善の方法ですか? そして、 myRectangle.OnMouseMove() が行うことは何でもしますか?

4

4 に答える 4

2

これは、Reactive LINQ (Rx) の使用に適しているように思われますが、私は前者の使用に慣れています。

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

どの四角形が交差する可能性があるかを判断するために最適化する必要がありますが、OnMouseMove を使用するだけで、LINQ クエリで入力された四角形を見つけることができます。

これは、潜在的にパフォーマンスを浪費する可能性があります。

于 2009-12-13T01:22:04.107 に答える
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);
  }
于 2009-12-13T12:51:13.890 に答える
0

2 つの四角形が別の内部にあるコントロールを作成できます。外側の四角形の OnMouseMove が公開されます。外側の長方形は見えなくなります。このようにして、Windows にイベント呼び出しを管理させることができ、コードが乱雑になることはありません。

于 2009-12-13T01:21:42.297 に答える