PictureBox内的图片拖动功能

时间:2023-03-08 19:34:03
PictureBox内的图片拖动功能

当 PictureBox内的图片太大,超过PictureBox边框时可以用下面的方法来实现,

 

通过重绘来实现 :

 

Code

bool wselected = false;

 Point p = new Point();

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

 {

 wselected = true;

 p.X = e.X;

 p.Y = e.Y;

 }

int driftX = 0, driftY = 0;

int mx = 0, my = 0;

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

 {

if (wselected)

 {

 driftX = p.X - e.X;

 driftY = p.Y - e.Y;

 mx = mx - driftX;

 my = my - driftY;

 Bitmap bm = new Bitmap(this.pictureBox1.Image);

 Graphics g = pictureBox1.CreateGraphics();

 g.Clear(pictureBox1.BackColor);

 g.DrawImage(bm, mx, my);

 p.X = e.X;

 p.Y = e.Y;

 bm.Dispose();

 g.Dispose();

 }

 }

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

 {

 wselected = false;

 }

 

 

 

方法二(上面的方法在拖动的时候闪烁比较严重):

 

原文:http://topic.csdn.net/u/20090121/21/fbdc1203-7f01-4c4b-86d7-0ae2960a76e4.html

 

Code

public Form1()

{

            InitializeComponent();

            //双缓存

            base.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);

            base.SetStyle(ControlStyles.ResizeRedraw | ControlStyles.Selectable, true);

        }

 Bitmap M_map_bufferpic;//加快GDI读取用缓存图片

/**//// <summary>

        /// 传入内存缓存中

        /// </summary>

        /// <param name="P_str_path">图片地址 </param>

private void inPutBuffer(string P_str_path)

{

            M_map_bufferpic = new Bitmap(P_str_path);

            pictureBox1.Image = M_map_bufferpic;

        }

private void button1_Click(object sender, EventArgs e)

{

            if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

                string path = openFileDialog1.FileName;

                openFileDialog1.Dispose();

                inPutBuffer(path);

            }

        }

 Point M_pot_p = new Point();//原始位置

int M_int_mx = 0, M_int_my = 0;//下次能继续

int M_int_maxX, M_int_maxY;//加快读取用

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

{

            M_pot_p = e.Location;

            M_int_maxX = pictureBox1.Width - M_map_bufferpic.Width;

            M_int_maxY = pictureBox1.Height - M_map_bufferpic.Height;

 Cursor = Cursors.SizeAll;

 }

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)//当按左键的时候

{

//算差值

M_int_mx=M_int_mx - M_pot_p.X + e.X;

 M_int_my=M_int_my - M_pot_p.Y + e.Y;

//锁定范围

M_int_mx = Math.Min(0, Math.Max(M_int_maxX, M_int_mx));

 M_int_my = Math.Min(0, Math.Max(M_int_maxY, M_int_my));

 Graphics g = pictureBox1.CreateGraphics();

 g.DrawImage(M_map_bufferpic, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height), new Rectangle(-M_int_mx, -M_int_my, pictureBox1.Width, pictureBox1.Height), GraphicsUnit.Pixel);

 M_pot_p = e.Location;

 }

else

{

 Cursor = Cursors.Default;

 }

 }