2017-05-07 4 views
2

Ich versuche, ein Programm zu erstellen, das mehrere Kreise erstellt, wenn Sie die Maus klicken. Das Problem ist, dass sie verschwinden (entfernt) jedes Mal, wenn ich auf einen anderen Ort klicke. Ich habe eine Klasse namens Ellipse erstellt, in der meine Kreise gespeichert sind. Dann lege ich alle in einen Stapel mit dem Namen Ellipsen. Ich habe mir verschiedene Lösungen angeschaut, aber immer noch die alten Ellipsen gelöscht. Ich möchte wissen, was ich falsch mache.Zeichnen Sie mehrere Kreise auf einem Formular

Hier ist mein Code.

public partial class Form1 : Form 
{ 
    int x,y; 
    Queue<MyEllipce> ellipses = new Queue<MyEllipce>(); 
    MyEllipce ellipse; 

    public Form1() 
    { 
     InitializeComponent(); 
     this.MouseClick += new MouseEventHandler(Form1_MouseClick); 

    } 
    private void Form1_Load(object sender, EventArgs e) 
    { 
    } 
    void Form1_MouseClick(object sender, MouseEventArgs e) 
    { 
     x = e.X; 
     y = e.Y; 
     ellipse = new MyEllipce(x, y); 
     ellipses.Enqueue(ellipse); 
     Invalidate(); 
    } 

    private void btnTaBort_Click(object sender, EventArgs e) 
    { 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     foreach (MyEllipce item in ellipses) 
     { 
      Graphics g = e.Graphics; 
      MyEllipce ellipse= ellipses.Peek(); 
      ellipse.Draw(g, x, y); 
     } 
    } 
} 


class MyEllipce 
{ 
    int x = 0; 
    int y = 0; 
    int diameter = 5; 

    //Constructor 
    public MyEllipce(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public void Draw(Graphics g, int x, int y) 
    { 
     SolidBrush brush = new SolidBrush(Color.Red); 
     g.FillEllipse(brush,x,y,diameter,diameter); 
    } 
} 
+0

Haben Sie meine Antwort versucht? –

+0

Ich würde für eine Liste gehen ; die meiste Zeit wirst du sie von Anfang bis Ende lesen. Und Sie werden sie in der Regel nicht löschen, oder werden Sie? (Was man mit einer Liste nur gut machen kann) Und da wir über a) User-Input sprechen und b) Bildschirm-Performance ist ohnehin kein Thema. Der Fehler ist anzunehmen, dass Peek zum Zeiger weitergeht. Es tut es nicht. – TaW

+2

Entweder "Dispose()" Ihrer "Pinsel" -Variable in 'Draw()' oder verwenden Sie die statische [Brushes.Red] (https://msdn.microsoft.com/library/windows/apps/system.drawing. brushs.red), die für Sie vom .Net-Framework bereitgestellt werden. –

Antwort

0

Ändern Sie diese

ellipse.Draw(g, x, y); 

Zu diesem

item.Draw(g, x, y); 

und die "Peek" Zeile löschen.

+0

Hat die Änderungen aber immer noch die gleiche Sache der vorherige Kreis wird nicht angezeigt. –

+0

Es zeichnet es überhaupt nicht ohne Invalidate(). –

+0

Nein nein Entschuldigung Es funktioniert –