2016-02-13 4 views
0

У меня есть много ярлыков на картинке. Я хочу, чтобы переместить метку относительно курсора, но метка должна прекратить движение, когда есть другая метка в направлении движенияОстановить перемещение метки, если другая метка найдена в том же направлении

Вот мой код

void lbl_MouseClick(object sender, MouseEventArgs e) 
    { 
     try 
     { 
      lblCutPaste = sender as Control; 
     } 
     catch (Exception err) 
     { 
      MessageBox.Show(err.Message); 
     } 
    } 

    void lbl_MouseDown(object sender, MouseEventArgs e) 
    { 
     try 
     { 
      activeControl = sender as Control; 
      previousLocation = e.Location; 
      // preloc = activeControl.Location; 
      Cursor = Cursors.Hand; 



     } 
     catch (Exception err) 
     { 
      MessageBox.Show(err.Message); 
     } 
    } 

    void lbl_MouseMove(object sender, MouseEventArgs e) 
    { 
     try 
     { 
      bool isCollide = false; 
      if (activeControl == null || activeControl != sender) 
       return; 
      var location = activeControl.Location; 
      location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y); 

      if (location.X >= 0 && location.X <= activeControl.Parent.Width - activeControl.Width && location.Y >= 0 && location.Y <= activeControl.Parent.Height - activeControl.Height) 
      { 
       activeControl.Location = location; 

      } 
     } 
     catch (Exception err) 
     { 
      MessageBox.Show(err.Message); 
     } 
    } 

    void lbl_MouseUp(object sender, MouseEventArgs e) 
    { 
     activeControl = null; 
     Cursor = Cursors.Default; 

    } 
+1

Я не вижу никакого кода – Maertin

+0

в направлении или перекрытии? – TaW

+0

Я дал код – Mritunjay

ответ

0

Вот рабочий пример; вам придется адаптировать свой код после его изучения. Не должно быть трудно вытащить лямбду в ваши события.

Сначала он создает 20 Labels и добавляет их на PictureBox. Он подключает каждый Label тремя событиями. Он окрашивает активный Label во время его перетаскивания.

Каждый Label также добавлен на уровень класса List<T>, поэтому мы можем легко выполнить проверку, в которой мы нуждаемся. Проверка использует LINQ для подсчета всех перекрывающихся ярлыков.

Это делает использование Rectangle.IntersectsWith и Point.Subtract методов ..

List<Label> myLabels = new List<Label>(); 
Label movingLabel = null; 
Point mDown = Point.Empty; 

private void button11_Click(object sender, EventArgs e) 
{ 
    Random R = new Random(8); 
    Size sz = pictureBox1.ClientSize; 
    for (int i = 0; i < 20; i++) 
    { 
     Label lbl = new Label() {Text = "L " + i}; 
     lbl.Location = new Point(R.Next(sz.Width), R.Next(sz.Height)); 
     lbl.Parent = pictureBox1; 
     myLabels.Add(lbl); 

     lbl.BorderStyle = BorderStyle.FixedSingle; 

     lbl.MouseDown += (ss, ee) => 
      { 
       movingLabel = lbl; 
       lbl.BackColor = Color.Bisque; 
       mDown = ee.Location; 
      }; 

     lbl.MouseMove += (ss, ee) => 
      { 
       if (ee.Button == MouseButtons.Left) 
       { 
        Point nLoc = Point.Subtract(lbl.Location, 
             new Size(mDown.X - ee.X, mDown.Y - ee.Y)); 
        Rectangle rlbNew = new Rectangle(nLoc, lbl.Size); 
        var overlapped = myLabels.Where(x => x != lbl && 
           rlbNew.IntersectsWith(new Rectangle(x.Location, x.Size))); 
        if (overlapped.Count() == 0) lbl.Location = nLoc; 
       } 
      }; 

     lbl.MouseUp += (ss, ee) => 
      { 
       movingLabel = null; 
       lbl.BackColor = Color.Transparent; 
      }; 
    } 
} 

Обратите внимание, что я не забочусь ли созданный Labels перекрытия, так что некоторые делают и как они это делают не могут быть раздвинуты, если вам продолжать перетаскивать, пока не достигнет «юридического»; то он перепрыгнет через наложенную метку и в новую позицию.

Если вы хотите, чтобы вы могли кодировать логику, чтобы можно было накладываться при перемещении, сделайте обратную красную краску, чтобы показать, что это не нормально, и попробуйте вернуться на MouseUp если он все еще перекрывается. Вам нужно будет сохранить исходное положение для этого. Но перетаскивание в юридическое положение, так как оно вполне может быть достаточно хорошим, imo ..

+0

Спасибо TaW за сотрудничество Спасибо – Mritunjay

+0

Спасибо Спасибо Спасибо Спасибо Спасибо, спасибо – Mritunjay

+0

Если вы удовлетворены ответом, рассмотрите возможность [принятия] (http://stackoverflow.com/) помощь/принято-ответ) это ..! - Я вижу, что вы никогда этого не делали. Пойдите (невидимую) галочку в левом верхнем углу, под голосами ответа и нажмите на нее! Он становится зеленым и обретает нам небольшую репутацию. – TaW

 Смежные вопросы

  • Нет связанных вопросов^_^