Вопрос по c#, mouseevent, winforms, pan, picturebox – Как панорамировать изображение внутри PictureBox

7

У меня есть обычайPictureBox который может увеличить используяMouseWheel событие. Теперь я хочу добавить функцию панорамирования. Я имею в виду, когда PictureBox находится в увеличенном состоянии, если пользователь щелкает левой кнопкой мыши и удерживает ее, а затем перемещает мышь, изображение будет перемещаться в пределах окна рисунка.

Вот мой код, но, к сожалению, он не работает! Я не знаю, где искать больше ...

private Point _panStartingPoint = Point.Empty;
private bool _panIsActive;

private void CurveBox_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Focus();
        _panIsActive = true;
        _panStartingPoint = e.Location;
    }
}

private void CurveBox_MouseUp(object sender, MouseEventArgs e)
{
    _panIsActive = false;
}

private void CurveBox_MouseLeave(object sender, EventArgs e)
{
    _panIsActive = false;

}

private void CurveBox_MouseMove(object sender, MouseEventArgs e)
{
    if(_panIsActive && IsZoomed)
    {
        var g = CreateGraphics(); //Create graphics from PictureBox

        var nx = _panStartingPoint.X + e.X;
        var ny = _panStartingPoint.Y + e.Y;
        var sourceRectangle = new Rectangle(nx, ny, Image.Width, Image.Height);
        g.DrawImage(Image, nx, ny, sourceRectangle, GraphicsUnit.Pixel);
    }
}

Я подозреваюMouseMove событие ... Я не уверен, что что-то происходит в этом событии и / илиnx а такжеny действительно содержит правильную точку.

Любые подсказки действительно полезны!

Ваш Ответ

1   ответ
10

private Point startingPoint = Point.Empty;
private Point movingPoint = Point.Empty;
private bool panning = false;

void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
  panning = true;
  startingPoint = new Point(e.Location.X - movingPoint.X,
                            e.Location.Y - movingPoint.Y);
}

void pictureBox1_MouseUp(object sender, MouseEventArgs e) {
  panning = false;
}

void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
  if (panning) {
    movingPoint = new Point(e.Location.X - startingPoint.X, 
                            e.Location.Y - startingPoint.Y);
    pictureBox1.Invalidate();
  }
}

void pictureBox1_Paint(object sender, PaintEventArgs e) {
  e.Graphics.Clear(Color.White);
  e.Graphics.DrawImage(Image, movingPoint);
}

Вы не утилизируете свой графический объект, и CreateGraphics в любом случае является просто временным чертежом (сворачивание приведет к его стиранию), поэтому я переместил код чертежа в событие Paint и просто аннулирую, когда пользователь выполняет панорамирование.

@SanuelJackson Image - это переменная изображения, объявленная на уровне формы. Плохой выбор имени, очевидно; должен был быть назван myImage или что-то в этом роде.
Что такое "изображение" определяется как в "e.Graphics.DrawImage (Image, movingPoint);"

Похожие вопросы