Einen Kreis zeichnen und wieder löschen

CopWorker

Erfahrenes Mitglied
Hallo,

ich schaffe es nicht einen Kreis in den Dialog zu zeichnen.
Eigentlich kann das doch nicht so dramatisch sein.
Aber es geht nicht.

C#:
private void btCyrcleOn_Click(object sender, EventArgs e)
{
    this.Paint += new PaintEventHandler(Kreis_Ein);
}

private void btCyrcleOff_Click(object sender, EventArgs e)
{
    this.Paint += new PaintEventHandler(Kreis_Aus);
}

void Kreis_Ein(object sender, PaintEventArgs e)
{
    using (Graphics g = e.Graphics)
    {
        Pen pen = new Pen(Brushes.Blue, 5);
        //g.DrawRectangle(pen, new Rectangle(new Point(100, 100), new Size(100, 100)));
        g.DrawEllipse(pen, new Rectangle(new Point(150, 150), new Size(30, 30)));
    }

}

void Kreis_Aus(object sender, PaintEventArgs e)
{
   using (Graphics g = e.Graphics)
   {
        Pen pen = new Pen(Brushes.Transparent, 5);
        //g.DrawRectangle(pen, new Rectangle(new Point(100, 100), new Size(100, 100)));
        g.DrawEllipse(pen, new Rectangle(new Point(150, 150), new Size(30, 30)));
   }

}

Wenn ich die Funktion this.Paint += new PaintEventHandler(Kreis_Ein); im Konstruktor aufrufe dann erscheint der Kreis.
Wenn ich diese im Button Click Event aufrufe, dann erscheint der Kreis nicht.

Nun 2 Probleme:
Wie entferne ich den Kreis wieder?
Was kann ich machen, dass der Kreis auch vor einer Groupbox oder vor einer PictureBox sichtbar wird?


Vielen Dank.
Gruß CobWorker
 
Hallo Zvoni,

wenn der EventHandler im Construktor sitzt:
this.Paint += new PaintEventHandler(Kreis_Ein);
Dann pinselt der gleich los.
Es soll aber erst gezeichnet werden, wenn in den Button drücke.

Grüße von CopWorker
 
Dann lass doch das EventHandler-Getöse im Button_Click weg.
Ist doch dann ein "normaler" Funktionsaufruf
 
mittels this.Paint += new PaintEventHandler(Kreis_Ein); wird erstmal nur der Ereignishandler zum zeichnen abonniert,
gezeichnet wird wenn das Control die aufforderung zum neuzeichnen bekommt, z.B: durch Invalidate() oder Refresh()

zu aller erst muss das Ereignis wieder normal im Kosntruktor abonniert werden oder noch besser die Methode OnPaint überschreiben.

Dann hälst du dir am einfachsten eine bool variable welche einfach nur den Zustand hält ob der Button gedrückt wurde oder nicht. Über diesen steuerst du ob der Kreis gezeichnet werden soll.

(ungetestet)
C#:
this.Paint += new PaintEventHandler(meinForm_Paint);


...


private bool kreisZeichnen;
   
private void btCyrcleOn_Click(object sender, EventArgs e)
{
    kreisZeichnen=true;
    Refresh();
}

private void btCyrcleOff_Click(object sender, EventArgs e)
{
    kreisZeichnen=false;
    Refresh();
}

void meinForm_Paint(object sender, PaintEventArgs e)
{
    if(kreisZeichnen)
    {
        Pen pen = new Pen(Brushes.Blue, 5);
        //g.DrawRectangle(pen, new Rectangle(new Point(100, 100), new Size(100, 100)));
        e.Graphics.DrawEllipse(pen, new Rectangle(new Point(150, 150), new Size(30, 30)));
    }
    else
        e.Graphics.Clear();
}
 
Hallo Spyke,
kann man den Kreis auch wieder entfernen?
Muss ich mir den "pen" und die Position merken und dann den "pen" auf
die Farbe "Brushes.Tansparent" setzen, anschließend "kreisZeichnen" auf true und "Refresh()" auslösen?

Probiere dann mal so aus.

Vielen Dank.
Grüße von CopWorker
 
mittels e.Graphics.Clear(Color.White);
(Oben im Post Zeile 30 siehst es, hatte da nur den Parameter oben vergessen)
könntest du direkt den zeichnung bereich zum beispiel leeren, wenn es nur um den Kreis geht musst du dir wohl merken wie du gezeichnet hast.


Ev. auch mittels GraphicPath zeichnen
Graphics.DrawPath(Pen, GraphicsPath) Methode (System.Drawing)
wenn du die Path angabe dir hälst könnteste ja theoretisch die Farbenändern wie de willst (theoretisch, hab nur bissl mal was mit GraphicPath gemacht)
 
Hallo Spyke,
das mit der Position wird nicht das Problem sein.
Die Markierung (Kreis) erfolgt um einen Steuerelement (Button).
Dann muss ich mal versuchen, ob ein nebenan liegendes Steuerelement (Button) überpinselt wird.
Denn die Buttons liegen sehr nahe beianander.

Vielen Dank vorerst.
Grüße von CopWorker
 

Neue Beiträge

Zurück