Не перемещайте метки за пределы PictureBox - PullRequest
0 голосов
/ 15 ноября 2018

Я создаю приложение, в котором я могу переместить Labels на PictureBox.
Проблема в том, что я хочу, чтобы эти метки перемещались только на внутри на PictureBox.

Вот мой код:

protected void lbl_MouseMove(object sender, MouseEventArgs e)
{
    Label lbl = sender as Label;

    try
    {
        if (lbl != null && e.Button == MouseButtons.Left)
        {
            if (m_lblLocation != new Point(0, 0))
            {
                Point newLocation = lbl.Location;
                newLocation.X = newLocation.X + e.X - m_lblLocation.X;
                newLocation.Y = newLocation.Y + e.Y - m_lblLocation.Y;
                lbl.Location = newLocation;
                this.Refresh();
            }
        }
    }
    catch(Exception ex) { }
}

protected void lbl_MouseUp(object sender, MouseEventArgs e)
{
    Label lbl = sender as Label;

    try
    {
        if (lbl != null && e.Button == MouseButtons.Left)
        {
            m_lblLocation = Point.Empty;
        }
    }
    catch(Exception ex) { }
}

protected void lbl_MouseDown(object sender, MouseEventArgs e)
{
    Label lbl = sender as Label;

    try
    {
        if (lbl != null && e.Button == MouseButtons.Left)
        {
            m_lblLocation = e.Location;
        }
    }
    catch(Exception ex) { }
}

В приведенном выше коде я создал несколько событий мыши для ярлыков.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Элемент управления PictureBox не является контейнером, вы не можете напрямую поместить в него другой элемент управления *1002*, как это было бы с Panel, GroupBox или другими элементами управления, которые реализуют IContainerControl.
Вы можете использовать родительский элемент Label (в данном случае), задав для Label Parent дескриптор PictureBox.Label.Bounds будет отражать родительский элемент Bounds.
Однако это не обязательно: вы можете просто рассчитать положение метки по отношению к элементу управления, который содержит как (Label (s), так и PictureBox):

Вы можете ограничить перемещения других Label элементов управления, подписывающихся на события MovableLabel_MouseDown/MouseUp/MouseMove.

Пример:

bool ThisLabelCanMove;
Point LabelMousePosition = Point.Empty;

private void MovableLabel_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        LabelMousePosition = e.Location;
        ThisLabelCanMove = true;
    }
}

private void MovableLabel_MouseUp(object sender, MouseEventArgs e)
{
    ThisLabelCanMove = false;
}

private void MovableLabel_MouseMove(object sender, MouseEventArgs e)
{
    if (ThisLabelCanMove)
    {
        Label label = sender as Label;

        Point LabelNewLocation = new Point(label.Left + (e.Location.X - LabelMousePosition.X),
                                           label.Top + (e.Location.Y - LabelMousePosition.Y));
        LabelNewLocation.X = (LabelNewLocation.X < pictureBox1.Left) ? pictureBox1.Left : LabelNewLocation.X;
        LabelNewLocation.Y = (LabelNewLocation.Y < pictureBox1.Top) ? pictureBox1.Top : LabelNewLocation.Y;
        LabelNewLocation.X = (LabelNewLocation.X + label.Width > pictureBox1.Right) ? label.Left : LabelNewLocation.X;
        LabelNewLocation.Y = (LabelNewLocation.Y + label.Height > pictureBox1.Bottom) ? label.Top : LabelNewLocation.Y;
        label.Location = LabelNewLocation;
    }
}

Label Move Inside Bounds

0 голосов
/ 15 ноября 2018

вам нужно отследить две вещи: 1. нажатие мыши или нет - bool IsMouseDown = false; 2. начальная позиция метки- Point StartPoint;

// mouse is not down
private void label1_MouseUp(object sender, MouseEventArgs e)
{
    IsMouseDown = false;
}


 //mouse is down and set the starting postion
 private void label1_MouseDown(object sender, MouseEventArgs e)
 {   
     //if left mouse button was pressed
     if (e.Button == System.Windows.Forms.MouseButtons.Left)
     {
         IsMouseDown = true;
         label1.BringToFront();
         StartPoint = e.Location;
      }
   }


    //check the label is withing the borders of the picture box
    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        if (IsMouseDown)
        {
            int left = e.X + label1.Left - StartPoint.X;
            int right = e.X + label1.Right - StartPoint.X;
            int top = e.Y + label1.Top - StartPoint.Y;
            int bottom = e.Y + label1.Bottom - StartPoint.Y;
            if (left > pictureBox1.Left && top > pictureBox1.Top && pictureBox1.Bottom >= bottom && pictureBox1.Right >= right)
            {
                label1.Left = left;
                label1.Top = top;
            }
        }
    }
...