2016-11-08 5 views
0

Hallo Leute Ich versuche, eine "Minipaint" -Anwendung zu machen, die drei Tasten (Rechteck, Kreis und Linie) hat. Ich habe Probleme damit, meine buttons Arbeit zu machen. Zum Beispiel habe ich dieses Rechteck-Klasse, die Farbe erbt, Dicke, Startpunkte x, y aus Form:Schaltfläche klicken Windows Form C#

class rectangle : shape 
{ 
    public int length { get; set; } 
    public int width { get; set; } 

    public override void Draw(Graphics g) 
    { 
     g.DrawRectangle(new Pen(color), new Rectangle(startx, starty, width, length)); 
    } 
} 

Jetzt möchte ich meine rectangle_btn_Click ein Rechteck in meinem panel drucken, wenn ich darauf klicken. hier ist mein panel Code:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = panel1.CreateGraphics(); 
} 

und das ist mein button:

private void rectangle_btn_Click(object sender, EventArgs e) 
{ 
    rectangle r = new rectangle(); 
    int retval = r.Draw(g); 
} 

Aber es einen Fehler hat und es nicht g erkennen. Wie soll ich das machen?

Antwort

3

Sie benötigen eine Grafik zu erklären Objekt global:

private Graphics g; 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    g = panel1.CreateGraphics(); 
} 

Dann ist dieses auch

private void rectangle_btn_Click(object sender, EventArgs e) 
{ 
    rectangle r = new rectangle(); 
    r.Draw(g); 
} 

Dies setzt voraus, panel1_Paint und rectangle_btn_Click beide erklärt in der gleichen Klasse funktionieren sollte.

EDIT:

Wie @ krw12572 wies darauf hin, das Problem dabei ist, dass die Form nach Minimierung des gezogene Objekt verschwinden, weil die Platte neu gezeichnet wird. Um das Problem zu lösen folgende Änderungen vorgenommen werden müssen:

private List<shape> shapes = new List<shape>(); 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    foreach (var shape in shapes) { 
     shape.Draw(e.Graphics); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    //This will however draw a rectangle at a fixed position with a fixed size   
    rectangle r = new rectangle() {startx = 10, starty = 10, length = 10, width = 10, color = Color.Black}; 
    shapes.Add(r); 
    panel1.Invalidate(); 
} 

Auch sollten die Klassen wie folgt aussehen:

public class shape 
{ 
    public Color color { get; set; } 
    public int width { get; set; } 
    public int startx { get; set; } 
    public int starty { get; set; } 

    public virtual void Draw(Graphics g) 
    { 

    } 
} 

public class rectangle : shape 
{ 
    public int length { get; set; } 
    public int width { get; set; } 
    public override void Draw(Graphics g) 
    { 
     g.DrawRectangle(new Pen(color), new Rectangle(startx, starty, width, length)); 
    } 
} 

Dieser Ansatz verwendet einen Cache mit allen Objekten, die gezogen werden müssen. Beim Klicken auf die Schaltfläche wird ein Objekt zum Cache hinzugefügt.

+1

Nein entsorgen = schlecht. – Sinatr

+0

Diese Lösung wird Syntaxfehler beheben und auch Rechteck zeichnen, aber wenn 'Panel1' neu gezeichnet wird, wird das Rechteck verschwinden. Versuchen Sie, die Anwendung zu minimieren und erneut zu maximieren (nachdem das Rechteck gezeichnet wurde), um zu sehen, wovon ich rede. –

+0

@ krw12572 Ich aktualisiere meine Antwort unter Berücksichtigung Ihrer Bedenken. Ich habe es auch getestet und es sollte auch nach Minimierung und Maximierung wieder korrekt funktionieren. –

0

Sie sollten Ihre Graphics-Variable 'g' entweder innerhalb von rectangle_btn_click oder auf Klassenebene außerhalb des Methodenbereichs deklarieren. Dann benutze es in deinen Stubs.

1

Sie sollten ein beliebiges Mal nur im Paint-Ereignishandler ausführen. Verwenden Sie ein Grafikobjekt aus dem Paint-Ereignishandler.

Das Implementieren dieser Methode mag zwar schwierig sein, aber jedes Mal, wenn Ihr Panel neu gezeichnet wird, wird Ihre gemalte Form verschwinden, wenn Sie nicht im Paint-Event malen.

private shape _shape; 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    _shape.Draw(e.Graphics); 
} 

private void rectangle_btn_Click(object sender, EventArgs e) 
{ 
    _shape = new rectangle(); 
    panel1.Invalidate(); 
} 

Update: Above Antwort wird vorausgesetzt, Sie Draw(Graphics g) Methode in der Basisklasse shape und es ist außer Kraft gesetzt/in rectangle Klasse implementiert.

+0

es hat "kann nicht zugeordnet werden, da es eine mehod Gruppe ist" Fehler für die Zeile _shape.Draw (e.Graphics); – sara

+0

Das liegt daran, dass Ihre Draw-Methode nicht in der 'shape' Klasse geschrieben ist. Versuchen Sie nun statt 'private shape _shape;' 'private rectangle _shape;'. Das sollte funktionieren. –

+0

danke das ist wirklich hilfreich – sara

Verwandte Themen