C# 快速移动图片

C# 快速移动图片,c#,.net,winforms,image,C#,.net,Winforms,Image,我需要在Windows窗体应用程序中移动图片 这是可行的,但速度非常慢。有没有办法让图片移动得更快?我想这样做是因为我想达到“飞入”效果 //第一次尝试 对于(int i=0;i

我需要在Windows窗体应用程序中移动图片

这是可行的,但速度非常慢。有没有办法让图片移动得更快?我想这样做是因为我想达到“飞入”效果

//第一次尝试
对于(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也会自动双缓冲)。