Как программно получить снимок экрана элемента управления .Net WinForms?

Как программно получить изображение элемента управления .Net?


person user34787    schedule 05.11.2008    source источник
comment
Это слишком расплывчато, попробуйте объяснить, что вы пытаетесь сделать. Не блуждайте отрицательными голосами.   -  person Pop Catalin    schedule 05.11.2008
comment
Нет блуждания? Я думаю, что смысл совершенно ясен. Он хочет получить растровое представление элемента управления.   -  person    schedule 05.11.2008
comment
Я согласен с Уиллом. Это простой и понятный вопрос.   -  person Bogdan    schedule 05.11.2008
comment
Надеюсь, вы не возражаете, что я немного переформулировал вопрос. Это хороший вопрос и хороший ответ Уилла.   -  person raven    schedule 05.11.2008


Ответы (7)


Для каждого элемента управления есть метод DrawToBitmap. Вам не нужно p/invoke для этого.

Control c = new TextBox();
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(c.Width, c.Height);
c.DrawToBitmap(bmp, c.ClientRectangle);
person Community    schedule 05.11.2008

Вы можете довольно легко получить изображение элемента управления .NET программно, используя метод DrawToBitmap класса Control, начиная с .NET 2.0.

Вот пример в VB

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

А вот на С#:

 Bitmap formImage = New Bitmap("C:\File.bmp")
 this.DrawToBitmap(formImage, this.Bounds)
person Joey    schedule 05.11.2008

Control.DrawToBitmap позволит вам нарисовать большинство элементов управления в растровое изображение. Это не работает с RichTextBox и некоторыми другими.

Если вы хотите захватить их или элемент управления, который имеет один из них, вам нужно выполнить PInvoke, как описано в этой статье CodeProject: Захват изображения

Позаботьтесь о том, чтобы некоторые из этих методов захватили все, что находится на экране, поэтому, если у вас есть другое окно, закрывающее ваш элемент управления, вы получите его вместо этого.

person Hallgrim    schedule 05.11.2008
comment
Для WebBrowser я просто привожу к Control и вызываю его там. Я сделал это и знаю, что это работает. Не уверен насчет RichTextBox - person Nick; 05.11.2008

Для элементов управления WinForms, которые его поддерживают, в классе System.Windows.Forms.Control есть метод:

public void DrawToBitmap(Bitmap bitmap, Rectangle targetBounds);

Однако это работает не со всеми элементами управления. Сторонние поставщики компонентов предлагают более комплексные решения.

person Alan    schedule 05.11.2008

Вот как это сделать для всего Form, а не только для клиентской области (у которой нет строки заголовка и другой отделки)

        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);
person Mark Lakata    schedule 06.05.2013

если это не элемент управления, который вы пытаетесь сделать, вы обычно можете привести его к базовому классу Control и вызвать там метод DrawToBitmap.

person Nick    schedule 05.11.2008

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

Примечание. Работает нормально.

person R Muruganandhan    schedule 09.06.2011