2008-11-05 6 views
32

Jak programowo uzyskać obraz kontrolki .Net?Jak programowo uzyskać zrzut ekranu programu .Net WinForms?

+0

To jest trochę zbyt ogólnikowe, spróbuj wyjaśnić, co próbujesz zrobić. Żadnych błądzących głosów. –

+1

Nie wędrować? Myślę, że znaczenie jest całkowicie jasne. Chce uzyskać bitmapową reprezentację kontroli. – Will

+3

Zgadzam się z Willem. To proste i jasne pytanie. – Bogdan

Odpowiedz

48

Na każdej kontroli znajduje się metoda o nazwie DrawToBitmap. Aby to zrobić, nie trzeba p/invoke.

Control c = new TextBox(); 
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(c.Width, c.Height); 
c.DrawToBitmap(bmp, c.ClientRectangle); 
3

Dla kontroli WinForms, które go obsługują, nie jest to metoda w klasie System.Windows.Forms.Control:

public void DrawToBitmap(Bitmap bitmap, Rectangle targetBounds); 

To nie działa ze wszystkimi sterownikami, jednak. Dostawcy komponentów innych producentów mają bardziej kompleksowe rozwiązania.

7

można uzyskać obraz kontroli NET programowo dość łatwo za pomocą DrawToBitmap metodę klasy sterowania począwszy od .NET 2.0

Oto przykład w VB

Dim formImage As New Bitmap("C:\File.bmp") 
    Me.DrawToBitmap(formImage, Me.Bounds) 

A tutaj jest w języku C#:

Bitmap formImage = New Bitmap("C:\File.bmp") 
this.DrawToBitmap(formImage, this.Bounds) 
1

jeśli nie jest na stronie ntrol, który próbujesz zrobić, zwykle możesz go rzucić na podstawową klasę Control i wywołać tam metodę DrawToBitmap.

5

Control.DrawToBitmap pozwoli ci narysować większość kontrolek do bitmapy. To nie działa z RichTextBox i niektórymi innymi. Jeśli chcesz je przechwycić lub kontrolkę, która ma jedną z nich, musisz wykonać PInvoke, jak opisano w artykule o projekcie kodu http://www.codeproject.com/KB/graphics/imagecapture.aspx, zaproponowanym przez Jeffa. Uważaj, aby niektóre z tych metod uchwyciły wszystko, co jest na ekranie, więc jeśli masz inne okno, które obejmuje kontrolę, dostaniesz to zamiast tego.

+0

Dla WebBrowser, po prostu wyrzucam do Control i tam go wołam. Zrobiłem to i wiem, że to działa. Nie jestem pewien co do RichTextBox – Nick

1
Panel1.Dock = DockStyle.None ' If Panel Dockstyle is in Fill mode 
Panel1.Width = 5000 ' Original Size without scrollbar 
Panel1.Height = 5000 ' Original Size without scrollbar 

Dim bmp As New Bitmap(Me.Panel1.Width, Me.Panel1.Height) 
Me.Panel1.DrawToBitmap(bmp, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height)) 
'Me.Panel1.DrawToBitmap(bmp, Panel1.ClientRectangle) 
bmp.Save("C:\panel.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) 

Panel1.Dock = DockStyle.Fill 

Uwaga: Jego pracy grzywny

2

To jak to zrobić dla całego Form, a nie tylko obszaru roboczego (który nie posiada paska tytułowego i inne opatrunek)

 Rectangle r = this.Bounds; 
     r.Offset(-r.X,-r.Y); 
     Bitmap bitmap = new Bitmap(r.Width,r.Height); 
     this.DrawToBitmap(bitmap, r); 
     Clipboard.SetImage(bitmap);