当 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;
}
}
相关文章
- canvas的处理图片功能
- ASP.NET MVC应用程序实现下载功能和显示上传的图片
- 40M左右的大图片如何在页面上展示啊?还要实现以鼠标为中心缩放功能
- github+hexo搭建自己的博客网站(三)主题之外的一些基本配置(图片位置,文章目录功能)
- 基于layui+cropper.js实现上传图片的裁剪功能
- 如何把PictureBox控件上的图片转换成可插入数据库的参数(对应数据库的Image字段)
- 左右滑动浏览图片,选中图片放大,浮在左右图片之上,图片的放大缩小拖动,多指触控
- python 1: 解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题
- javascript实现 京东淘宝等商城的商品图片大图预览功能
- Android实现图片滚动和页签控件功能的实现代码