2014-05-17 128 views
-2

嘗試使用visual studio在c#中繪製一個pacman e開始畫點,但我有一些麻煩,我寫這個類來創造點。繪製一個填充的橢圓不會出現

public class draw : System.Windows.Forms.Control 
{ 
    public draw(int x, int y, int h, int c) { 

     System.Drawing.SolidBrush brush1 = new System.Drawing.SolidBrush(System.Drawing.Color.Yellow); 
     System.Drawing.Graphics formGraphics = this.CreateGraphics(); 
     formGraphics.FillEllipse(brush1, new System.Drawing.Rectangle(x, y, h, c)); 
     brush1.Dispose(); 
     formGraphics.Dispose(); 
    } 
} 

然後在一個新聞形式的按鈕,它應該創建一些點,但什麼也沒發生

draw d = new draw(100,100,100,100); 
draw d1 = new draw(200,200,200,200); 
+1

'CreateGraphics'不是你如何畫東西。您處理窗體或控件的「Paint」事件。 –

回答

0

有兩個錯誤在你的代碼:

1 - 借鑑了形式或控制是不持久的;因此所有繪圖必須發生在繪畫事件中或從那裏觸發。一個好的解決方案是在那裏調用繪圖代碼,並將繪畫事件的e.Graphics作爲參數傳遞。

2 - 您使用CreateGraphics並嘗試着色。無論如何,只要你想,結果就會消失。最小化你的窗口並恢復它。但實際上沒有任何東西顯示在第一位。爲什麼?那麼,你的繪製blob是一個內部類和這裏關鍵字this不是的形式,但到繪圖類。所以,你創建一個無形的控制圖形(無大小,這不是形式的一部分),當然,沒有任何反應..

如果你想擁有拉絲項目,他們應該

  • 店的大小,位置,狀態等(在他們的構造函數)和

  • 有一個繪圖方法,你可以從外面呼叫和被交給一個Graphics對象,他們再畫自己對..

  • 該Ÿ也應該有一個更好的名字,像PacDot等..

下面是一個最小的版本:

// a list of all PacDots: 
public List<PacDot> theDots = new List<PacDot>(); 

public class PacDot : System.Windows.Forms.Control 
{ 
    public PacDot(int x, int y, int w, int h) 
    { 
     Left = x; Top = y; Width = w; Height = h; 
    } 

    public void Draw(Graphics G) 
    { 
     G.FillEllipse(Brushes.Brown, 
     new System.Drawing.Rectangle(Left, Top, Width, Height)); 
    } 
} 


private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    foreach (PacDot dot in theDots) dot.Draw(e.Graphics); 
} 

// a test button: 
private void button1_Click(object sender, EventArgs e) 
{ 
    theDots.Add(new PacDot(30, 10, 5, 5)); 
    theDots.Add(new PacDot(30, 15, 5, 5)); 
    theDots.Add(new PacDot(15, 10, 5, 5)); 
    this.Invalidate(); 
} 

PS:由於您的抽獎類確實是一個控制後代你也可以將它們添加到Form1.Controls.Add(..);但他們仍然必須有繪畫事件,他們在那裏繪畫自己..

+0

您列舉的兩個問題實際上是同一個問題。要持久地繪製表單/控件,需要處理Paint事件(或覆蓋OnPaint)。在該事件處理程序中,您傳遞一個Graphics對象來繪製。如果您在任何地方使用CreateGraphics進行繪製(包括在Paint事件處理程序中),那麼您做錯了。 –

+0

嗯,他們走到一起,他們會一起走開,但他們是非常明顯的錯誤。您可以通過使用有效的圖形對象來糾正第二個問題,但仍然錯過了持久性問題。你可以使用Paint事件,並在內部類中錯誤地使用'this'關鍵字.. – TaW

+0

我明白你的答案,我已經完成了第一個和第三個任務,但第二個任務(...繪圖方法... )我明白你的意思,但我不知道使用哪種方法以及如何使用它 – user3591111