2015-08-22 122 views
-1

我在這裏有一些代碼沒有註冊爲真實的,我已經迷失了幾個小時。我很抱歉,如果它只是一個愚蠢的錯誤。C#矩形點註冊表

bool Bdrag; 
private void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point Floater = new Point(e.X, e.Y); 
    Rectangle Rect = new Rectangle(200, 200 ,40 , 40); 
    Rectangle Rect2 = new Rectangle(250, 250, 40, 40); 
    if(Rect.Contains(Floater)) 
    { 
     if(e.Button == MouseButtons.Left) 
     { 
      Bdrag = true; 
     } 
     else 
     { 
      Bdrag = false; 
     } 
     Console.WriteLine("success 1"); 
     if(Rect2.Contains(Floater) && Bdrag == true) 
      { 
       Console.WriteLine("success 2!!") 
      } 
    } 
} 

我不能永遠到達的WriteLine(「成功2!」),即使我呈現矩形,並確保我打他們在我創建的順序。

再次感謝你們。

+0

面板內是否都是矩形? – Jibbow

+0

你解決了你的問題嗎? :) – Jibbow

回答

1

假設我正確理解你正在嘗試做什麼,這不會像這樣工作。讓我來舉個例子:

Your rectangles don't touch each other (according to your coordinates): 
     __________ 
    |   | 
    | 1  | 
    |   | 
    |__________| 
        __________ 
        |   | 
        | 2  | 
        |   | 
        |__________| 

當您在Rect1中移動鼠標時觸發事件。讓我們走你的代碼:

if(Rect.Contains(Floater))是明確的。
假設按下鼠標左鍵Bdrag設置爲true
Console.WriteLine("success 1");被觸發。
if(Rect2.Contains(Floater) && Bdrag == true)最初是錯誤的,因爲Floater將始終位於Rect1中,因爲它的位置僅在鼠標位於Rect1內時設置。

當你移動鼠標indise Rect2現在沒有任何反應。爲什麼?

  1. 您的活動是可能未觸發。我無法確定它是否真的如此,因爲我在代碼中看不到它,但可能是因爲事件的名稱。
  2. 即使事件被觸發,它也不會傳遞第一個if語句,因爲顯然它不再處於Rect1中。

解決方案:

  1. 使連接到事件用下面的代碼一個方法:

    bool Bdrag; 
    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
        Rectangle Rect = new Rectangle(200, 200 ,40 , 40); 
        Rectangle Rect2 = new Rectangle(250, 250, 40, 40); 
        if(Rect.Contains(new Point(e.X + Rect.Location.X, e.Y + Rect.Location.Y))) 
        { 
         if(e.Button == MouseButtons.Left) 
         { 
          Bdrag = true; 
         } 
         else 
         { 
          Bdrag = false; 
         } 
        } 
        if(Rect2.Contains(new Point(e.X + Rect2.Location.X, e.Y + Rect2.Location.Y)) && Bdrag == true) 
        { 
         //is executed when Rect2 has been hit after Rect1 
        } 
    } 
    
  2. 或者做兩個分離式的事件:

    bool Bdrag; 
    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
        Rectangle Rect = new Rectangle(200, 200 ,40 , 40); 
         if(e.Button == MouseButtons.Left) 
         { 
          Bdrag = true; 
         } 
         else 
         { 
          Bdrag = false; 
         } 
    } 
    
    private void panel2_MouseMove(object sender, MouseEventArgs e) 
    { 
        Rectangle Rect2 = new Rectangle(250, 250, 40, 40); 
        if(Rect2.Contains(new Point(e.X + Rect2.Location.X, e.Y + Rect2.Location.Y)) && Bdrag == true) 
        { 
         //is executed when Rect2 has been hit after Rect1 
        }   
    } 
    
+0

感謝您花時間回答這個問題,它不適用於我。 – Havion

+0

你絕對真實!現在我有時間測試它,並且我認識到'Floater'總是與矩形的相對座標。我不知道,但我會改變答案:) – Jibbow

+0

考慮到你的問題,向我展示了一些其他的東西:我假設'矩形'由表單上的面板表示。這是真的?如果是這樣,我可以給你一個更好的方法。 – Jibbow