2015-10-06 74 views
0

我有一個.png文件,我想繪製,問題是,我正在繪製這個PNG每秒的1/10,所以這是每秒10次。這個png是用X和Y座標作爲中間點繪製的,所以圖像的中間是X和Y座標。使用gdi + flickerfree繪圖+

使用此代碼:

private void frmMap_Paint(object sender, PaintEventArgs e) 
{ 
    Bitmap FlashLight = new Bitmap(
     Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + @"light.png"), 4000, 2160); 
    e.Graphics.DrawImage(FlashLight, new Point(mapX, mapY)); 
} 

問題是雖然,這種繪製PNG每秒10次時,不斷變化的X和Y座標在閃爍的很多結果。

有沒有人有任何想法如何減少或消除閃爍?我已經考慮繪製位圖關閉屏幕,並加載它一旦完成繪圖,我不知道如何做到這一點。

我也研究過雙緩衝,這再次我不知道如何使用它來減少我的閃爍。

+0

看起來像你正在繪製到窗體上。它有一個屬性'DoubleBuffered',這是第一步。但不要太希望;使用Winforms的動畫是相當有限的.. – TaW

+3

此外,你正在重新加載位圖上的每個繪畫迭代。這超出了浪費。只做一次。 – Rotem

+0

@TaW你會推薦使用什麼動畫?因爲我只是在新的位置重新繪製PNG,但重畫的問題是屏幕變白,整個PNG被重繪。它不一定是流暢的動畫,它可以是矮胖的,但不會閃爍太多 – BramSnoek

回答

0

Winforms絕對不適合動畫。

這裏有一個建議,你可能會或可能找不到足夠好:

負載大ImagePictureBox.Image並設置PictureBox.SizeMode = AutoSize

然後在您的動畫Timer.Tick左右移動PictureBox

這是一個很小的例子:

Timer timer = new Timer(); 
timer.Interval = 100; 
timer.Tick += timer_Tick; 

// when the timer runs.. 
timer.Enabled = !timer.Enabled; 

..它移動PictureBox各地:

void timer_Tick(object sender, EventArgs e) 
{ 
    Point pt = new Point(pictureBox1.Left + offsetX, pictureBox1.Top + offsetY); 
    pictureBox1.Location = pt; 
} 

注意,位置可以進入負沒有任何問題!

要居中的圖像使用的起始位置:

pictureBox1.Location = new Point(-(pictureBox1.Width - Width)/2, 
           -(pictureBox1.Height - Height)/2); 

爲了更好的動畫支持,你可以考慮使用WPF。

+0

即時通訊在這個東西atm,所以這個問題可能聽起來真的很愚蠢,但你是什麼意思與offsetX和offsetY – BramSnoek

+0

,因爲我知道你在做什麼,但我需要給(已知)X和Y座標,需要是圖片盒的起點正在移動,甚至更好的圖片框 – BramSnoek

+0

你想要移動圖像的中間點,對吧?所以你需要改變它的位置一些金額。這就是兩個變量的作用。你可以像這樣計算初始位置的中心位置pb.left = - (pb.width - form.width)/ 2; – TaW