C# 快速移动图片
我需要在Windows窗体应用程序中移动图片 这是可行的,但速度非常慢。有没有办法让图片移动得更快?我想这样做是因为我想达到“飞入”效果C# 快速移动图片,c#,.net,winforms,image,C#,.net,Winforms,Image,我需要在Windows窗体应用程序中移动图片 这是可行的,但速度非常慢。有没有办法让图片移动得更快?我想这样做是因为我想达到“飞入”效果 //第一次尝试 对于(int i=0;i
//第一次尝试
对于(int i=0;i<500;i++)
{
//Tempbox是一个图片盒
this.Tempbox.Location=新点(this.Tempbox.Left++,0);
Application.DoEvents();
系统.线程.线程.睡眠(50);
}
//第二次尝试
使用(Graphics g=Graphics.FromImage(BufferBm))
{
对于(int i=0;i<500;i++)
{
g、 DrawImage(tempContolImage,新系统绘图点(i,0));
this.Tempbox.Image=BufferBm;
Application.DoEvents();
系统.线程.线程.睡眠(50);
}
}
使用WPF。
您还可以混合使用winForms和WPF
如果不使用WPF,请确保将doublebuffer设置为true,使用WPF。
您还可以混合使用winForms和WPF
如果不使用WPF,请确保将doublebuffer设置为true
- 最简单的方法之一是在面板上或其他地方绘制图像-就像您所做的那样-然后在窗体上移动图像
- 另一种方法是使用转换技术
- 我也推荐WPF,因为它使用directx,但如果您没有时间学习,这可以帮助您:
设置DoubleBuffered=true
将此破解放入表单代码中:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
如果您有usercontrol,请将其放入其代码中:
protected override CreateParams CreateParams {
get {
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
我还推荐WPF,因为它使用directx,但如果您没有时间学习,这可以帮助您: 设置DoubleBuffered=true 将此破解放入表单代码中:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
如果您有usercontrol,请将其放入其代码中:
protected override CreateParams CreateParams {
get {
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
您需要处理
Paint
事件并在控件上绘制,然后在计时器上执行Invalidate()
。尝试在每次迭代中移动一个以上的像素。越接近最终设置,减少像素量,使其具有更柔和的结尾。在WinForms中,它永远不会是超级平滑的。考虑使用定时器代替循环,这是有问题的。如果你想要真正的快速绘图而不使用DirectX,使用GDI代替GDI+。扩展@ Valter的建议:看看CaseDeBMAP。Afaik使用GDI(不带+)。您需要处理Paint
事件并在控件上绘制,然后在计时器上执行Invalidate()
。尝试在每次迭代中移动一个以上的像素。越接近最终设置,减少像素量,使其具有更柔和的结尾。在WinForms中,它永远不会是超级平滑的。考虑使用定时器代替循环,这是有问题的。如果你想要真正的快速绘图而不使用DirectX,使用GDI代替GDI+。扩展@ Valter的建议:看看CaseDeBMAP。Afaik使用GDI(不带+)。谢谢你的回答。不幸的是,使用Wpf“真的”是不可能的,它是一个相对巨大的应用程序,它需要大量的重新编码。Doublebuffered已设置为true(afaik picturebox也自动设置为Doublebuffered)。感谢您的回答。不幸的是,使用Wpf“真的”是不可能的,它是一个相对巨大的应用程序,它需要大量的重新编码。Doublebuffered已设置为true(afaik picturebox也会自动双缓冲)。