这个是我要操作的图片,需要您把picturebox添加到一个form窗体中然后绑定以下事件
public Form2()
{
InitializeComponent();
}
Bitmap Ima = new Bitmap("b.jpg");
private void Form2_Load(object sender, EventArgs e)
{
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox1.Image = Ima; pictureBox1.Location = new Point(0, 0);
pictureBox1.Size = new Size(14000, 800);
}
Point p1 = new Point(); Point p2 = new Point(); bool status = false;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
p1 = new Point(e.X, e.Y); status = true;
}
}
Rectangle rec = new Rectangle();
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
Point p2 = new Point(e.X, e.Y);
if (p2.X < 0)
{
p2.X = 0;
}
if (p2.Y < 0)
{
p2.Y = 0;
}
if (p2.X > pictureBox1.Width)
{
p2.X = pictureBox1.Width;
}
if (p2.Y > pictureBox1.Height)
{
p2.Y = pictureBox1.Height;
}
if (p2.X > p1.X)
{
rec.X = p1.X;
rec.Width = p2.X - p1.X;
}
else
{
rec.X = p2.X;
rec.Width = p1.X - p2.X;
}
if (p2.Y > p1.Y)
{
rec.Y = p1.Y;
rec.Height = p2.Y - p1.Y;
}
else
{
rec.Y = p2.Y; rec.Height = p1.Y - p2.Y;
}
this.Refresh();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (status)
{
Graphics gg = e.Graphics;
gg.DrawRectangle(new Pen(Color.Red, 2), rec);
}
}
以上是我的代码,出现重绘缓慢的是鼠标左键在控件中点击以下 然后拖动绘制矩形很慢跟不上鼠标的速度,我切换其它图片就没有问题,并且picturebox大小变成20000*800不存在这个问题
如延迟(与上次处理时间比对进行延迟)Invalidate,或者MouseUp Invalidate;
不过按道理说这点消耗在GDI+ Frameworks 2.0后不存在。我怀疑你其他影响到“绘制性能”了,如用的this.Refresh(),你应该用pictureBox1.;甚至更小的区域做参数。
我尝试以下 麻烦您创建一个demo帮我也看看 谢谢您
刚刚尝试了 没效果。。
如果我把pictureBox1.Size改成 = new Size(20000, 800);他的绘制速度就跟得上我的鼠标就是正常的
但是如果这样更改的话和需求不对应 没啥用 我还是得解决目前这个问题
@余道长: 用pictureBox1.Invalidate(Rectangle())会好点。这种Demo MSDN是很多的(MS过去的SDK都有很详细的Demo),粘贴就有了。做控件样式现在很少用重绘,GDI+也顶多用在Bitmap上面,学习玩玩就行了。WPF数倍的开发效率,现在别个c++都玩Direct UI,想比GDI+的硬件加速,硬件利用率更高。
你这种写法也不对,既然只是画个矩形,干嘛在那么“重”的控件上画,反正你又不是画到Bitmap上,自己想想。你可以这么试,扔弃一切东西,直接在窗口或者只加一个Control(不要做任何操作)上绘制,如果还卡,应该机器可以扔了。
背景是类似天空的容器,图片比你这大很多,包含了一个图表(右下角就是Resize,是即时的),很正常。
@花飘水流兮: 我正在测试 没问题得话就你了
有一定提升,谢谢了 我再研究研究
@花飘水流兮: 我其实是画的矩形控件然后功能做完了 效果不是很理想 就这样弄得demo来测试得
不要真的去绘制,定义一个空的 bitmap,在空的bitmap上画框,然后显示在picture上面就行
实际的bitmap很大,空的bitmap很小
那他能实现点击框可以拖动 修改大小吗?