2009-12-04 52 views
0

我想通過每20ms更改一次top和left屬性來移動一個包含控件的picturebox。在黑色背景上,它更平滑一些,但是在爲控件分配BackgroundImage後,圖片框會在其後面留下蹤跡,直到控件在幾秒鐘後重新繪製,突然減慢然後向前啓動或以鋸齒形軌跡移動。用定時器移動一個picturebox

我認爲當PictureBox控件重繪時,更改其左側屬性和頂部屬性的線程將暫停,直到重繪完成,並導致它排隊等待定時器循環的任何迭代,當重繪爲完成。

有無論如何平滑picturebox的運動?

感謝 ˚F

+0

system.timer or form.timer? – Fredou 2009-12-04 18:41:18

+0

System.Timers.Timer – Michali 2009-12-07 12:37:51

+0

我將其更改爲System.Windows.Timer,移動明顯更平滑,但我寧願它發生在不同的線程上。 – Michali 2009-12-07 12:57:35

回答

3

我建議在一個控件中繪製圖像,而不是移動控件。

創建一個自定義控件,覆蓋OnPaint並在裏面繪製「圖片框」。如果你這樣做,你也可以回緩衝區。通過調用Graphics.FromImage()來從圖像創建圖形對象。在完成繪製後,將其繪製到該圖層上,最後在REAL圖形對象(eventArgs中)上調用g.DrawImage。

+0

這似乎有助於跟蹤和鋸齒狀的運動。然而,我仍然堅持Bitmap在經過幾英寸之後靜止一兩秒鐘的問題。 – Michali 2009-12-07 12:55:17

+0

你的代碼中是否存在一個錯誤的Application.DoEvents()?這將解釋這種延遲。如果你沒有使用它,那麼我想知道可能會導致這個問題。你能把它解壓成一個小而完整的例子嗎? – Quibblesome 2009-12-07 13:07:54

+0

我可能會提到,現在運動是清晰的,而不是抖動,但只有當自定義控件運行在它自己的單獨應用程序中時纔是如此。我想要運行它的大型應用程序有另一個計時器,並執行其他一些事情,所以其他事情正在接管。我會嘗試在一個線程中運行該運動,如果這不起作用,我會在這方面回覆你。謝謝。 – Michali 2009-12-07 14:48:13

2

我並不確切地知道如何解決這個問題(而不是切換到WPF等),但我可以說,你要滯後從區域是正在失效未來在移動PictureBox時更新。你想要做的是以某種方式回退緩衝新位置並切換到緩衝區,而不是依靠GDI來實時重繪。 HTH。