Я создаю приложение, в котором я могу перемещать 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) { }
}
В приведенном выше коде я создал несколько событий мыши для меток.





вам нужно отслеживать две вещи:
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;
}
}
}
Элемент управления PictureBox не является контейнером, вы не можете напрямую поместить в него другой элемент управления внутри, как вы бы сделали с Panel, GroupBox или другими элементами управления, которые реализуют IContainerControl.
Вы можете создать родительский элемент для Label (в данном случае), установив в качестве родительского элемента Label дескриптор 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;
}
}
просто поместите метки на панель и залейте фон панели изображением