2010-04-09 13 views
6

Ehi, ho bisogno di fare il mio disegno su un pannello in C# ma senza inserire il mio codice di disegno all'interno di "panel1_Paint", come posso farlo ?? BTW, sto usando WinForms.Come posso disegnare su un pannello in C#?

Aggiornamento: Ho dimenticato di fare qualcosa di chiaro, non ho bisogno di inserire il mio codice di disegno all'interno del gestore di vernice, perché ho bisogno di iniziare a disegnare a seconda degli eventi dei pulsanti.

+0

Utilizzi WinForms? O WPF? – Vlad

+0

Sto usando WinForms. – Lisa

+0

Perché vuoi metterlo da qualche altra parte e non nel gestore di eventi vernice? –

risposta

13

Generalmente si eseguono tutti i disegni nel gestore eventi vernice. Se si desidera eseguire un aggiornamento (se un utente fa clic sul pannello per esempio), è necessario rimandare l'azione: si memorizzano i dati richiesti (coordinate su cui l'utente ha fatto clic) e impongono un ridisegno del controllo. Ciò causa l'attivazione dell'evento paint, in cui è possibile disegnare le cose memorizzate in precedenza.

Un altro modo sarebbe (se si vuole veramente disegnare al di fuori del gestore di eventi 'panel1_Paint') per disegnare all'interno di un'immagine del buffer e copiare l'immagine nell'oggetto di grafica dei controlli nel gestore di eventi paint.

Aggiornamento:

Un esempio:

public class Form1 : Form 
{ 
    private Bitmap buffer; 

    public Form1() 
    { 
     InitializeComponent(); 

     // Initialize buffer 
     panel1_Resize(this, null); 
    } 

    private void panel1_Resize(object sender, EventArgs e) 
    { 
     // Resize the buffer, if it is growing 
     if (buffer == null || 
      buffer.Width < panel1.Width || 
      buffer.Height < panel1.Height) 
     { 
      Bitmap newBuffer = new Bitmap(panel1.Width, panel1.Height); 
      if (buffer != null) 
       using (Graphics bufferGrph = Graphics.FromImage(newBuffer)) 
        bufferGrph.DrawImageUnscaled(buffer, Point.Empty); 
      buffer = newBuffer; 
     } 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     // Draw the buffer into the panel 
     e.Graphics.DrawImageUnscaled(buffer, Point.Empty); 
    } 



    private void button1_Click(object sender, EventArgs e) 
    { 
     // Draw into the buffer when button is clicked 
     PaintBlueRectangle(); 
    } 

    private void PaintBlueRectangle() 
    { 
     // Draw blue rectangle into the buffer 
     using (Graphics bufferGrph = Graphics.FromImage(buffer)) 
     { 
      bufferGrph.DrawRectangle(new Pen(Color.Blue, 1), 1, 1, 100, 100); 
     } 

     // Invalidate the panel. This will lead to a call of 'panel1_Paint' 
     panel1.Invalidate(); 
    } 
} 

Ora le immagini tratte wont essere persi, anche dopo un ridisegno del controllo, perché attira solo il buffer (l'immagine, salvato nella memoria). Inoltre puoi disegnare le cose ogni volta che si verifica un evento, semplicemente attingendo al buffer.

+1

Suvato, ma mi piacerebbe molto se il Refresh() fosse cambiato in panel1.Invalidate(), e se il rendering fosse fatto nella sua stessa funzione, chiamato dall'evento click del pulsante. Allegare un gestore di ridimensionamento per ridimensionare il buffer sarebbe la ciliegina. :) – overslacked

+0

@overslacked: sei giusto. done :) –

+0

Grazie è quello a cui stavo pensando, ma non riuscivo a capire tutto da solo. – Lisa

1

Prova questo: cosa succede quando torni alla tua applicazione, dopo aver usato un'altra applicazione che copre una parte o tutta la tua finestra?

Quello che dovresti fare è rendere ciò che ti serve in un bitmap fuori schermo, chiamato buffer. Renderete l'immagine ogni volta che volete, in risposta a tutto ciò che cambia ciò che l'immagine dovrebbe mostrare. Quindi, dall'evento paint del pannello, copierai da quel buffer al pannello.

La programmazione grafica è molto divertente. Potrebbe sembrare che ci siano molti dettagli da considerare, ma non ce ne sono molti una volta appresi. Ma questa è un'area in cui si manifesta un approccio slapdash e può far sentire un'applicazione inaffidabile e poco professionale.

+0

Esattamente, per quello che è quello che ho già detto. –

+0

@ overslacked/phild: per un principiante, questa spiegazione potrebbe essere difficile da capire. Forse uno di voi potrebbe pubblicare un esempio di codice? Sarebbe bello avere un modo meno accattivante del mio. –

+0

@Charles: sei giusto. Un momento ... –

Problemi correlati