Pan PictureBox внутри панели при перемещении мыши
У меня есть pictureBox1, который находится внутри Panel1, одинакового размера. Изменение размера pictureBox1 по событию MouseWheel, когда размер pictureBox1 больше размера Panel1, тогда пользователь может перемещать изображение PictureBox1 по событию Mouse_Move (хочет перемещаться с помощью перетаскивания мыши, а не полос прокрутки). Я написал код, который запрещает пользователям перемещаться по границам Panel1. Прямо сейчас код может предотвратить только верхний левый или нижний правый угол. Проблема в моем коде заключается в том, что когда пользователь перемещается в верхний правый угол или нижний левый угол, изображение Box1 все еще может панорамировать. Но если панорамировать только одну из сторон, PictureBox1 остается внутри Panel1. Я попытался отредактировать свой код, но не смог найти правильное решение. если кто-то может помочь мне разобраться с этой проблемой в моем коде, это очень поможет.
Код ниже находится под pictureBox1_MouseMove
событие
if (pictureBox1.Width > panel1.Width || pictureBox1.Height > panel1.Height)
{
int count = 0; // Counter to check Top-Left points, if crossed panel's (0,0) points
// If count = 1, Set pictureBox point X or Y to 0.
// If count = 2, Set both the points of pictureBox to (0,0)
int count2 = 0; // Counter to check Bottom-Right points, if crossed Panels negative values calculated by panel1.Width-pictureBox1.Width
// If count2 = 1, Set pictureBox point X or Y to minPointX or minPointY .
// If count2 = 2, Set both the points of pictureBox to (minPointX, minPointY )
int minPointX = panel1.Width - pictureBox1.Width;
int minPointY = panel1.Height - pictureBox1.Height;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculation for Left Top corner.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ((e.X - startPoint.X) >= 0 && pictureBox1.Location.X >= 0)
{
pictureBox1.Location = new Point(0, pictureBox1.Location.Y);
count++;
}
if((e.Y - startPoint.Y) >= 0 && pictureBox1.Location.Y >= 0)
{
pictureBox1.Location = new Point(pictureBox1.Location.X, 0);
count++;
}
if (count == 1)
{
if(pictureBox1.Location.X == 0)
pictureBox1.Location = new Point(0, pictureBox1.Location.Y + e.Y - startPoint.Y);
if( pictureBox1.Location.Y == 0)
pictureBox1.Location = new Point(pictureBox1.Location.X + e.X - startPoint.X, 0);
}
if (count == 2)
pictureBox1.Location = new Point(0, 0);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculation for Bottom Right corner.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if((e.X - startPoint.X) <= 0 && pictureBox1.Location.X <= minPointX)
{
pictureBox1.Location = new Point(minPointX, pictureBox1.Location.Y);
count2++;
}
if((e.Y - startPoint.Y) <= 0 && pictureBox1.Location.Y <= minPointY)
{
pictureBox1.Location = new Point(pictureBox1.Location.X, minPointY);
count2++;
}
if(count2 == 1)
{
if (pictureBox1.Location.X == minPointX)
pictureBox1.Location = new Point(minPointX, pictureBox1.Location.Y + e.Y - startPoint.Y);
if (pictureBox1.Location.Y == minPointY)
pictureBox1.Location = new Point(pictureBox1.Location.X + e.X - startPoint.X, minPointY);
}
if (count2 == 2)
pictureBox1.Location = new Point(minPointX, minPointY);
if (count == 0 && count2 == 0)
pictureBox1.Location = new Point(pictureBox1.Location.X + e.X - startPoint.X, pictureBox1.Location.Y + e.Y - startPoint.Y);
}
Текущий код останавливает пользователя, чтобы переместить pictureBox за точку (0,0) в верхнем левом углу, если пользователь пытается переместить pictureBox вправо-вниз, и за точку (minPointX, minPointY), если пользователь пытается переместить PictureBox в направлении сверху-справа.minPointX
а также minPointY
рассчитывается путем вычитания panel.Width
в pictureBox.Width
а также panel.Heigh
в pictureBox.Height
соответственно. minPointX и minPointY - это минимальные точки, на которые пользователь может переместить pictureBox в направлении отрицательных осей x и y.
2 ответа
Вы можете использовать панель autoScroll
имущество. Убедитесь, что pictureBox
внутри панель не закреплена. Затем установите панель autoScroll
собственность на true
,
Теперь, когда pictureBox
становится больше, чем панель, на которой автоматически отображаются полосы прокрутки. Теперь в событии перемещения мыши установите AutoScrollPosition
как показано в приведенном ниже коде. Надеюсь, поможет. В приведенном ниже коде е является MouseEventArgs
,
panel1.AutoScrollPosition = new Point(-(panel1.AutoScrollPosition.X + e.X - startPoint.X),
-(panel1.AutoScrollPosition.Y + e.Y - startPoint.Y));
Вот процедура, которая противоречит контролю, чтобы оставаться в области просмотра. Предполагается, что оба измерения больше, чем окно просмотра.
void constrain(Control ctl, Control view)
{
Rectangle pr = view.ClientRectangle;
Rectangle cr = ctl.ClientRectangle;
int x = Math.Min(0, Math.Max(ctl.Left, pr.Width - cr.Width));
int y = Math.Min(0, Math.Max(ctl.Top, pr.Height - cr.Height));
ctl.Location = new Point(x,y);
}