PictureBox内的图片拖动功能

来源:互联网 发布:耐热胶带 知乎 编辑:程序博客网 时间:2024/05/17 03:42
当 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;
 }
 }
0 0