2010-11-12 28 views
8

Tengo panel y varios controles en él. Me gustaría guardar una imagen de este panel en un archivo, ¿cómo puedo hacer esto?¿Cómo guardar el objeto gráfico como imagen en C#?

Ineed para hacer algo como captura de pantalla, pero necesito solo la imagen de cierto panel en mi aplicación y quiero hacer clic en un botón en mi aplicación.

Saludos, PRIMOŽ


EDIT: También dibujo en este panel utilizando este código

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

Pero entonces yo no nos llevamos esto en la imagen. ¿Por qué y cómo solucionar esto?


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; 
     } 
    } 
} 

Este es mi código de dibujo para dibujar una línea personalizado en un gráfico. ¿Puedes ayudarme a hacerlo de la manera adecuada?

Respuesta

14

Utilice el método Control.DrawToBitmap(). Por ejemplo:

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

+1 genial, también resolvió mi problema. –

+0

Esto no funciona completamente para mí. Agregué problemas que tengo a mi pregunta original. – Primoz

+1

No debería dibujar así. Intente, por ejemplo, minimizar y luego restaurar la ventana. La línea se ha ido. Lo mismo sucederá cuando mueva otra ventana a través del suyo en XP. Use el evento Paint del control en su lugar. –

3

En respuesta a tu edición:

Si está dibujando en el panel utilizando un objeto Graphics devuelto por el método CreateGraphics, sus gráficos no son permanentes. Cualquier cosa que dibuje en el objeto se borrará la próxima vez que se vuelva a dibujar el control. (Para obtener información más detallada sobre este tema, ver: http://www.bobpowell.net/picturebox.htm y http://www.bobpowell.net/creategraphics.htm)

Cuando se utiliza el método DrawToBitmap según lo sugerido por la respuesta de Hans Passant, el panel de control está recibiendo vuelve a dibujar, lo que está causando sus dibujos que se pierde.

En cambio, si desea que sus dibujos sean permanentes, debe controlar el evento Paint del control del panel. Este evento se produce cada vez que se necesita volver a dibujar el control, y proporciona una instancia de PaintEventArgs que contiene un objeto Graphics que puede usar para dibujar permanentemente en la superficie del control de la misma manera que estaba usando el objeto CreateGraphics método.

Una vez que haya corregido su código de dibujo, puede usar la solución de Hans.

+0

Edité mi pregunta inicial para agregar mi código de dibujo para dibujar una línea personalizada en un Gráfico. ¿Puedes ayudarme a hacerlo de la manera adecuada? – Primoz

+0

¿Qué pongo en el evento de pintura? –

Cuestiones relacionadas