Jak programowo uzyskać obraz kontrolki .Net?Jak programowo uzyskać zrzut ekranu programu .Net WinForms?
Odpowiedz
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);
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.
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)
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.
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.
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
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
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);
To jest trochę zbyt ogólnikowe, spróbuj wyjaśnić, co próbujesz zrobić. Żadnych błądzących głosów. –
Nie wędrować? Myślę, że znaczenie jest całkowicie jasne. Chce uzyskać bitmapową reprezentację kontroli. – Will
Zgadzam się z Willem. To proste i jasne pytanie. – Bogdan