How to pan Image inside PictureBox

14,050

I think the math is backwards. Try it like this:

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);
}

You aren't disposing your graphic object, and CreateGraphics is just a temporary drawing anyway (minimizing would erase it) so I moved the drawing code to the Paint event and am just invalidating as the user is panning.

Share:
14,050
EMBEDONIX
Author by

EMBEDONIX

Protecting yourself against thrown exceptions, considered as a defensive programming practice.

Updated on June 04, 2022

Comments

  • EMBEDONIX
    EMBEDONIX almost 2 years

    I have a custom PictureBox which can zoom in using MouseWheel event. Now I want to add a panning feature to it. I mean when PictureBox is in zoomed state, if user left clicks and holds the click then move the mouse, the image would pan within the picturebox.

    Here is my code but unfortunately it does not work! I don't know where to look anymore...

    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);
        }
    }
    

    I am suspecting the MouseMove event...I am not sure if anything happens in this event and/or nx and ny does contain correct point.

    Any helps/tips is really appriciated!