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);
}
Другие вопросы по тегам