How do you programmatically obtain a picture of a .Net control?
-
This is a bit too vague, try to explain what are you trying to do. No wander the down votes. – Pop Catalin Nov 05 '08 at 18:22
-
1No wander? I think the meaning is perfectly clear. He wants to get a bitmap representation of a control. – Nov 05 '08 at 18:24
-
4I agree with Will. It's a simple and clear question. – Bogdan Nov 05 '08 at 18:33
-
1I hope you don't mind that I reworded the question a bit. It's a good question and a good answer by Will. – raven Nov 05 '08 at 18:59
7 Answers
There's a method on every control called DrawToBitmap. You don't need to p/invoke to do this.
Control c = new TextBox();
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(c.Width, c.Height);
c.DrawToBitmap(bmp, c.ClientRectangle);
You can get a picture of a .NET control programmatically pretty easily using the DrawToBitmap method of the Control class starting in .NET 2.0
Here is a sample in VB
Dim formImage As New Bitmap("C:\File.bmp")
Me.DrawToBitmap(formImage, Me.Bounds)
And here it is in C#:
Bitmap formImage = New Bitmap("C:\File.bmp")
this.DrawToBitmap(formImage, this.Bounds)
Control.DrawToBitmap will let you draw most controls to a bitmap. This does not work with RichTextBox and some others.
If you want to capture these, or a control that has one of them, then you need to do PInvoke like described in this CodeProject article: Image Capture
Take care that some of these methods will capture whatever is on the screen, so if you have another window covering your control you will get that instead.
-
For WebBrowser, I just cast to Control and call it there. I've done it and know it works. Not sure about RichTextBox – Nick Nov 05 '08 at 18:47
This is how to do it for an entire Form
, not just the Client area (which doesn't have the title bar and other dressing)
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);

- 19,989
- 5
- 106
- 123
For WinForms controls that support it, there is a method in the System.Windows.Forms.Control class:
public void DrawToBitmap(Bitmap bitmap, Rectangle targetBounds);
This does not work with all controls, however. Third party component vendors have more comprehensive solutions.

- 6,501
- 1
- 28
- 24
if it's not on the control you're trying to do, you can usually cast it to the base Control class and call the DrawToBitmap method there.

- 9,113
- 4
- 25
- 29
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
Note: Its working fine

- 76,472
- 17
- 159
- 346

- 21
- 1