2010-11-12 9 views
8

devo pannello e vari controlli su di esso. Vorrei salvare un'immagine di questo pannello in un file, come posso fare questo?Come salvare l'oggetto Graphics come immagine in C#?

Ineed fare qualcosa di simile screenshot, ma ho bisogno solo di immagini di alcuni pannelli nella mia richiesta e voglio fare questo su un clic del pulsante nella mia app.

Con i migliori saluti, Primoz


EDIT: Ho anche disegnare su questo pannello utilizzando questo codice

  Graphics g = chartTemperature.CreateGraphics();  
      g.DrawLine(p, prevPoint, e.Location); 
      prevPoint = e.Location; 

Ma poi non si ottiene questo in immagine. Perché e come risolvere questo problema?


EDIT 2:

namespace Grafi 
{ 
    public partial class Form1 : Form 
    { 

     bool isDrawing = false; 
     Point prevPoint; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void chartTemperature_MouseDown(object sender, MouseEventArgs e) 
     { 
      isDrawing = true; 
      prevPoint = e.Location; 
     } 

     private void chartTemperature_MouseMove(object sender, MouseEventArgs e) 
     { 
      Pen p = new Pen(Color.Red, 2); 
      if (isDrawing) 
      { 
       Graphics g = chartTemperature.CreateGraphics();  
       g.DrawLine(p, prevPoint, e.Location); 
       prevPoint = e.Location; 

       numOfMouseEvents = 0;    
      } 
      p.Dispose(); 
     } 

     private void chartTemperature_MouseUp(object sender, MouseEventArgs e) 
     { 
      isDrawing = false; 
     } 
    } 
} 

Questo è il mio codice di disegno per disegnare una linea personalizzata su un grafico. Potete per favore aiutarmi a farlo nel modo giusto? Metodo

risposta

14

Utilizzare la Control.DrawToBitmap(). Per esempio:

private void button1_Click(object sender, EventArgs e) { 
     using (var bmp = new Bitmap(panel1.Width, panel1.Height)) { 
      panel1.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      bmp.Save(@"c:\temp\test.png"); 
     } 
    } 
+0

uno grande, hai risolto anche il mio problema. –

+0

Questo non funziona completamente per me. Ho aggiunto problemi che ho nella mia domanda iniziale. – Primoz

+1

Non si dovrebbe disegnare in questo modo. Prova ad esempio riducendo al minimo, quindi ripristinando la finestra. La linea è andata. La stessa cosa succederà quando sposterai un'altra finestra sulla tua su XP. Utilizzare invece l'evento Paint del controllo. –

3

In risposta alla tua modifica:

Se si sta disegnando sul pannello utilizzando un oggetto Graphics restituito dal metodo CreateGraphics, la grafica non sono permanenti. Tutto ciò che si disegna sull'oggetto verrà cancellato la volta successiva che il controllo viene ridisegnato. (Per informazioni più dettagliate su questo argomento, vedi: http://www.bobpowell.net/picturebox.htm e http://www.bobpowell.net/creategraphics.htm)

Quando si utilizza il metodo DrawToBitmap come suggerito dalla risposta di Hans passant, il pannello di controllo è sempre ridisegnato, che sta causando i disegni da perdere.

Invece, se si desidera che i disegni siano permanenti, è necessario gestire l'evento Paint del pannello di controllo. Questo evento viene generato ogni volta che è necessario ridisegnare il controllo e fornisce un'istanza di PaintEventArgs che contiene un oggetto Graphics che è possibile utilizzare per disegnare in modo permanente sulla superficie del controllo nello stesso modo in cui si stava utilizzando l'oggetto Graphics restituito da CreateGraphics metodo.

Una volta che hai corretto il codice di disegno, è possibile utilizzare la soluzione di Hans.

+0

Ho modificato la mia domanda iniziale per aggiungere il mio codice di disegno per disegnare una linea personalizzata su un grafico. Potete per favore aiutarmi a farlo nel modo giusto? – Primoz

+0

Cosa inserisco nell'evento paint –

Problemi correlati