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