2010-11-08 11 views
6

ho disegnato un cerchio in forma finestreCome eliminare un cerchio disegnato in forma di C# windows?

Pen pen = new Pen(Color.Black, 3); 
Graphics gr = this.CreateGraphics(); 
gr.DrawEllipse(pen, 5,5,20,20); 

Come eliminarlo ...

+0

Uno utilizza Graphics.Clear() con un colore desiderato, utilizzare la logica ho inviato come risposta, o eseguire questo.Invalidate(). L'ultimo semplicemente costringerà il modulo a ridisegnare l'area client che eliminerà effettivamente il cerchio. –

+0

Poiché si sta utilizzando 'this.CreateGraphics', probabilmente non lo si sta disegnando nell'evento Paint. Ciò significa che ogni volta che il modulo viene ridisegnato (o perché si chiama il metodo 'Invalidate' o perché Windows invia un messaggio' WM_PAINT'), la cerchia verrà cancellata comunque. Se vuoi che il cerchio sia semi-permanente (almeno per rimanere lì fino a quando non lo cancelli esplicitamente), devi assicurarti di disegnarlo nel gestore di eventi Paint per il tuo modulo, usando l'oggetto Graphics che viene passato nel 'PaintEventArgs' per l'evento. –

+0

Basta minimizzare la finestra e ripristinarla di nuovo. –

risposta

10

È possibile invalidare la regione sorteggio che si desidera aggiornare, ad esempio:

this.Invalidate(); 

sul modulo ...

15

È necessario cancellare la vostra grafica:

Graphics.Clear(); 

Ma tutte le figure disegnate verranno cancellate. Semplicemente, sarà necessario ridisegnare tutte le figure tranne quel cerchio.

Inoltre, è possibile utilizzare il metodo Invalidate:

Control.Invalidate() 

Indica una regione ad essere ridisegnato all'interno della vostra grafica. Ma se hai figure che si intersecano dovrai ridisegnare le figure che vuoi vedere all'interno della regione tranne il cerchio.

Questo può diventare complicato, si consiglia di verificare come progettare un control graph o utilizzare qualsiasi layout grafico library.

+0

Non vedo che cosa abbia a che fare un grafico di controllo (ovvero un diagramma di flusso) con questa domanda. –

+0

Un grafico di controllo è solitamente alla base di come viene costruito un motore di layout grafico. Pertanto, potrebbe aiutare a determinare ciò che deve essere disegnato o invalidato. È solo un'apertura sul soggetto ... –

+2

non c'è Graphics.clear, e se si usa Graphics gr; gr = ....; gr.clear() dà un errore perché ha bisogno di un argomento, un colore – barlop

5

Supponendo che si sta sottoscrivendo l'evento Paint o ignorando la routine OnPaint protetta, allora si avrà bisogno di eseguire qualcosa di simile:

bool paint = false; 

protected override void OnPaint(object sender, PaintEventArgs e) 
{ 
    if (paint) 
    { 
    // Draw circle. 
    } 
} 

poi, quando si vuole smettere di dipingere un cerchio:

paint = false; 
this.Invalidate(); // Forces a redraw 
+0

Questo ha il vantaggio di consentire al modulo di ridisegnare la sua area client. Utilizzando Graphics.Clear dipingi sopra l'area client con un colore solido. –

+0

Se un quadrato si trova all'interno del cerchio e si annulla la regione attorno al cerchio, anche il quadrato verrà invalidato. Usando questa tecnica dovrai disegnare tutto ciò che è all'interno di quella regione che potresti voler vedere. –

+0

Che si può fare facilmente se si mette semplicemente questa logica fuori dal controllo condizionale e si impone l'invalidazione quando si desidera che il modulo venga ridisegnato. La logica di OnPaint viene richiamata ogni volta che il modulo invalida una regione (o l'intera area del client del modulo). –

2

Non si "elimina" è di per sé, non c'è niente da eliminare. È un disegno, si disegna qualcos'altro o si può chiamare lo Graphics.Clear()method.

+0

Hai ragione, ma se sta disegnando in Paint/OnPaint allora può semplicemente includere un flag per disegnare un cerchio o meno, quindi invalidare il modulo. La logica interna del modulo ridisegnerà la sua area client senza il cerchio. –

2

È possibile fare una figura di stesse dimensioni che utilizzano il BackColor del controllo in cui si sta disegnando

uso dopo il codice per cancellare la vostra figura.

Pen p = new Pen(this.BackColor); 
gr.DrawEllipse(p, 5,5,20,20); 
-4

È molto semplice eliminare un cerchio disegnato da c.

C'è solo quattro fasi: -

  1. Aprire turbo app
  2. andare al comando in cui si era disegnato il cerchio
  3. trascinare il comando
  4. clic sul pulsante Elimina
2

Se u si utilizza Invalidate() e non funziona, fare un panel.Refresh().

che lavorerà su di voi.

+0

penso che questo commento sia la soluzione ..... Invalidare il pannello (modulo, scheda, ......) non è una buona idea ....specialmente quando è necessario modificare la grafica dopo i clic o qualsiasi evento di cambiamento frequente ..... –

0

Infatti, lo può eliminare la tua cerchia e nient'altro che la tua cerchia.

Tutto ciò che serve è qualcosa come uno screenshot dello "stato precedente" dell'area che si desidera cancellare, per creare un TextureBrush da esso. È possibile raggiungere questo passo da qualcosa di simile:

Bitmap _Background = new Bitmap(this.Width, this.Height); 
Graphics.FromImage(_Background).CopyFromScreen(this.Left, this.Top, 0, 0, this.Size); 

La prima linea vi darà una bitmap nella vostra taglia su Windows Form. La seconda riga salverà uno screenshot di esso nello _Background-bitmap.

Ora si crea un TextureBrush fuori di esso:

Brush brsBackground = new TextureBrush(_Background); 

La prossima cosa che serve sono le dimensioni del vostro cerchio, così si dovrebbe salvarli in una variabile, se non sono un valore fisso. Quando li hai a portata di mano, è possibile cancellare l'area specifica in questo modo:

Graphics gr = this.CreateGraphics(); 
gr.FillEllipse(brsBackground, 5, 5, 20, 20); // values referred to your example 

Fatto!

figure Anche complessi possono essere eliminati da questa, come un GraphicsPath per esempio:

GraphicsPath gp = new GraphicsPath(); // any kind of GraphicsPath 
gr.FillRegion(brsBackground, new Region(gp)); 
Problemi correlati