1. 程式人生 > >PictureBox內的圖片拖動功能

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

方法二(上面的方法在拖動的時候閃爍比較嚴重):

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