2015-08-22 4 views
-1

У меня есть код здесь, который не регистрируется, чтобы быть правдой, и я потерялся в течение нескольких часов. Прошу прощения, если это просто глупая ошибка.C# Rectangle point registry

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.

Когда вы перемещаете указатель мыши 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