2010-11-12 17 views
8

Mam panel i różne elementy sterujące. Chciałbym zapisać obraz tego panelu w pliku, jak mogę to zrobić?Jak zapisać obiekt graficzny jako obraz w języku C#?

Chciałbym zrobić zrzut ekranu, ale potrzebuję tylko obrazu z niektórych paneli w mojej aplikacji i chcę to zrobić za pomocą kliknięcia przycisku w mojej aplikacji.

poważaniem Primož


EDIT: ja też rysować na tym panelu przy użyciu tego kodu

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

Ale wtedy nie dostaniesz to na obrazie. Dlaczego i jak to naprawić?


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

To jest mój kod rysunek narysować linię na wykresie niestandardowe. Czy możesz mi pomóc, aby zrobić to w odpowiedni sposób?

Odpowiedz

14

Użyj metody Control.DrawToBitmap(). Na przykład:

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 świetnie, rozwiązałeś również mój problem. –

+0

To nie działa całkowicie dla mnie. Dodałem problemy, które mam do mojego pierwotnego pytania. – Primoz

+1

Nie powinieneś rysować w ten sposób. Spróbuj na przykład zminimalizować, a następnie przywrócić okno. Linia zniknęła. To samo stanie się, gdy przeniesiesz kolejne okno na XP. Zamiast tego użyj zdarzenia Paint sterowania. –

3

W odpowiedzi na EDIT:

Jeśli rysunek na panelu przy użyciu Graphics obiektu zwróconego przez metodę CreateGraphics, graficzna nie są trwałe. Wszystko, co rysujesz na obiekcie, zostanie usunięte przy następnym ponownym rysowaniu kontrolki. (Aby uzyskać więcej szczegółowych informacji na ten temat, patrz: http://www.bobpowell.net/picturebox.htm i http://www.bobpowell.net/creategraphics.htm)

Podczas korzystania z metody DrawToBitmap jak sugeruje odpowiedź Hansa passant, tym panel sterowania jest coraz przerysowana, co jest przyczyną swoje rysunki zostaną utracone.

Zamiast tego, jeśli chcesz, aby Twoje rysunki były trwałe, musisz obsługiwać zdarzenie Paint sterowania panelem. To zdarzenie jest wywoływane za każdym razem, gdy konieczne jest odświeżenie kontroli, i dostarcza instancję o numerze PaintEventArgs zawierającą obiekt Graphics, który można wykorzystać do ciągłego rysowania na powierzchni kontrolki w taki sam sposób, jak w przypadku obiektu Graphics zwracanego przez obiekt Graphics. metoda.

Po poprawieniu kodu rysunkowego można skorzystać z rozwiązania Hansa.

+0

Edytowałem moje pierwsze pytanie, aby dodać mój kod rysunkowy, aby narysować niestandardową linię na wykresie. Czy możesz mi pomóc, aby zrobić to w odpowiedni sposób? – Primoz

+0

Co umieszczam w zdarzeniu paint –