2009-12-13 183 views
0

我有一個List<Rectangle> myRectangles在一個Panel控件中呈現。如果我想在鼠標位於任何myRectangles內時觸發事件處理程序,是做'foreach'的最佳選擇嗎?然後去做任何我的Rectangle.OnMouseMove()會做什麼?捕獲鼠標

+0

嗨,當你說「渲染」,你的意思矩形是通過繪製事件在面板中繪製?或者他們是某種類型的「對象」?矩形的大小是固定的,還是可以重新調整大小,或移動...如果是對象?我們可以假設矩形不會重疊?你可以越清楚,你得到的答案就越清晰:) – BillW 2009-12-13 04:10:07

回答

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); 
    } 
+0

感謝您的協助。確實很有幫助。 – IAbstract 2009-12-14 17:14:49

0

您可以創建一個控件,其中有兩個矩形。外部矩形的OnMouseMove將被暴露。外面的矩形是不可見的。這樣你可以讓Windows管理事件調用而不是混亂的代碼。

2

這對於反應性LINQ或Rx似乎很好用,但我更熟悉使用前者。

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

您將要優化,以確定哪些矩形可可能相交,但只要使用的OnMouseMove,然後在你的LINQ查詢,你會發現在輸入爲準矩形。

這可能是一個表現豬。

+0

感謝您的鏈接!這是非常「遠」C#編程! – BillW 2009-12-13 02:59:51

+0

@BillW - 使用Reactive LINQ的一個好處是可以確定方向的斜率,並預測下一個將要觸及的矩形,以提高性能。 – 2009-12-13 05:20:54

+0

@詹姆斯謝謝。如果「斜率」的計算(預測)有用,則取決於具體的使用情景:用戶的目的,最終用戶可能會做的模態活動。在這個我們不太瞭解的細節問題中,我們不知道OP的意圖/設計/用例是什麼。但是,我覺得你的評論很有意思,並且非常感謝。我還沒有從WinForms「跳槽」到WPF,但承認被WPF更強大的事件控制能力(冒泡和廣播)所吸引。另一方面,我發現C#和XAML之間的往返想法真奇怪:) – BillW 2009-12-13 10:36:49

0

我假設你必須使用Winforms?如果是這樣,您可能需要考慮使矩形獨立於子控件(呈現OnPaint中的任何矩形),並使用由Control提供的鼠標事件。

+0

我正在考慮使用/繼承控制。但是,有性能方面的考慮。首先,這個GUI需要儘可能輕量級。我正在創建可重複使用的面板和儘可能少的控件(按鈕等)。據MS說,堅持儘可能多的GDI +,將大大提高性能。我需要爲真正重要的地方預留資源 - 我計劃實施近乎實時的網絡通信監控和資源昂貴的網絡服務器應用程序。 – IAbstract 2009-12-14 17:13:36