2014-02-21 72 views
0

我需要移动我的Windows窗体应用程序中的图片。快速移动图片

这工作,但速度非常慢。有什么方法可以更快地移动图片?我想这样做是因为我想达到“飞翔效果”。

// First try 
for (int i = 0; i < 500; i++) 
{ 
    //Tempbox is a picturebox 
    this.Tempbox.Location = new Point(this.Tempbox.Left++, 0); 
    Application.DoEvents(); 
    System.Threading.Thread.Sleep(50); 
} 

// Second try 
using (Graphics g = Graphics.FromImage(BufferBm)) 
{ 
    for (int i = 0; i < 500; i++) 
    { 
    g.DrawImage(tempContolImage, new System.Drawing.Point(i, 0)); 
    this.Tempbox.Image = BufferBm; 
    Application.DoEvents(); 
    System.Threading.Thread.Sleep(50); 
    } 
} 
+0

您需要处理的'Paint'事件,并借鉴控制,然后在一个定时器上使'Invalidate()'失效。 – SLaks

+0

尝试在每次迭代中移动多个像素。越接近最终设置,减少像素量以使其更柔和。它在WinForms中永远不会非常流畅。考虑使用计时器而不是循环,[DoEvents](http://stackoverflow.com/q/5181777/719186)存在问题。 – LarsTech

+0

如果您想要真正快速的绘图,而不是使用directx,请使用GDI而不是GDI +。 –

回答

3

我也建议WPF,因为它使用DirectX,但如果你没有时间去学习它,这可以帮助你:

How to fix the flickering in User controls

设置DoubleBuffered = TRUE;

将这个攻入表单代码:

protected override CreateParams CreateParams { 
    get { 
    CreateParams cp = base.CreateParams; 
    cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED 
    return cp; 
    } 
} 

如果有用户控件将此放入它的代码:

protected override CreateParams CreateParams { 
    get { 
    var parms = base.CreateParams; 
    parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN 
    return parms; 
    } 
} 
2

使用WPF。 http://msdn.microsoft.com/de-de/library/ms752312(v=vs.110).aspx

你也可以混用winForms和WPF。

如果你不使用WPF确保设置双缓冲真

+0

感谢您的回答。不幸的是,使用Wpf并不是“真正”的可能,它是一个相对较大的Fromsapplication,它会对很多重新编码。 Doublebuffered已设置为true(afaik picturebox也自动双缓冲)。 – RandomDude

0
  • 其中一个最简单的方法可以是面板或等你般那么did-移动窗体上的绘制图像。
  • 另一种方法是使用转换技术。