2013-06-05 38 views
0

我有一個用戶控件,它包含一個按panel1名稱排列的面板。有在panel1_paint其中提請面板上的一些線指示,我會在一個窗口的形式通過以下行來執行漆事件:在繪製一些圖形之後爲控件添加動畫效果

注:DrawLines已UserControl1.CS定義

public void DrawLines() 
{ 
    ... 
    ... 
      panel1.Invalidate();  
} 

我不知道爲什麼這不會運行,也許它畫線,然後面板刷新,這使面板被清除。 所以我改變了我的代碼如下:

public void DrawLines() 
{ 
    ... 
    ... 
    panel1_Paint(this, new PaintEventArgs(panel1.CreateGraphics(), 
     panel1.ClientRectangle)); 


} 

這工作nice.it得出了一些線在面板上,現在主要部分是: 有,他們會在運行時面板上創建一些對象兒童。我想將它們移動到面板上(例如,假設有火焰顆粒)。所以當我將它們移動(動畫)timer時,Paint事件的e.Graphics所繪製的線條將被清除並移除,如果面板上的任何對象(粒子)移過它們。 那麼,我該如何避免這種情況?!我的Invalidation有問題嗎? 如何在面板上同時顯示線條和移動粒子? 面板已經完成了圖形,但爲什麼通過移動它的對象,圖形將被刪除?

+0

的createGraphics()是問題。在Paint()事件中,使用提供的「e.Graphics」進行繪製,所有應該都可以。然後你可以使用你的原始代碼「panel1.Invalidate();」 –

+0

你能舉個例子嗎? –

回答

1

下面介紹如何使用所提供的圖形在paint()事件:

private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics G = e.Graphics; 

     // ... use "G" to draw with ... 
     G.DrawLine(Pens.Black, 0, 0, panel1.Width, panel1.Height); 
    } 

然後,你可以簡單地使用:

panel1.Invalidate(); 
+0

我在第二個代碼中使用過。我認爲雙緩衝存在問題.... –

+0

需要查看更多代碼才能瞭解問題。基本上使用CreateGraphics()繪製到**臨時**表面,這就是爲什麼當您通過對它們的控制時圖形被擦除的原因。正確的方法是使用上面顯示的「e.Graphics」。 –

+0

HMM,看起來是正確的,我會通過啓用Double Buffering來檢查。 –

相關問題