Я знаю, что это старая тема, но поскольку я так и не нашел хорошего ответа на вопрос, как предотвратить перетаскивание элемента управления за пределы панели, я подумал, что добавлю решение, которое я собрал. Я использовал некоторые советы сверху и некоторые свои собственные.
private void Form1_Load(object sender, EventArgs e)
{
_originalClip = Cursor.Clip;
}
private void pb_MouseMove(object sender, MouseEventArgs e)
{
PictureBox pb = (PictureBox)sender;
if (e.Button == MouseButtons.Left)
{
Size sz = new Size(panel1.RectangleToScreen(panel1.ClientRectangle).Width - (pb.Width), panel1.RectangleToScreen(panel1.ClientRectangle).Height - (pb.Height));
Point loc = new Point(panel1.RectangleToScreen(panel1.ClientRectangle).X + (pb.Width / 2), panel1.RectangleToScreen(panel1.ClientRectangle).Y + (pb.Height / 2));
Rectangle rct = new Rectangle(loc, sz);
Cursor.Clip = rct;
pb.Left += (e.X - x);
pb.Top += (e.Y - y);
}
}
private void pb_MouseUp(object sender, MouseEventArgs e)
{
Cursor.Clip = _originalClip;
}
Для этого используется метод Cursor.Clip вместе с объектом Rectangle, размер которого устанавливается равным размеру панели ("panel1" в коде), содержащей группу Pictureboxes ("pb" в коде) , Размер нового прямоугольника устанавливается на родительскую панель за вычетом ширины и высоты Picturebox, а его расположение устанавливается на расположение панели1 минус половина ширины и высоты Picturebox. Это дает вам прямоугольник, который ограничит использование Picturebox за пределами панели.