recientemente se pregunto en dos post como se podría salvar la imagen de un
PictureBox con todo y controles añadidos. Al principio se sugirió utilizar
la clase Graphics y dibujar nosotros mismos la apariencia del control teniendo
en cuenta el tipo: Label, PictureBox, etc. El código necesario para esto se
hace muy engorroso a medida que necesitamos dibujar más y más controles (por no
mencionar el hecho de dibujar mediante Graphics un TabControl…). Aquí dejo una
manera más sencilla:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace Temp
{
class PictureBoxEx : PictureBox
{
public Image GetCompleteImage()
{
Bitmap bitmap = this.Image.Clone() as Bitmap;
for (int i = this.Controls.Count - 1;i>=0 ; i--)
{
this.Controls[i].DrawToBitmap(bitmap,this.Controls[i].Bounds);
}
return bitmap;
}
}
}
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Windows.Forms
Imports System.Drawing
Namespace Temp
Class PictureBoxEx
Inherits PictureBox
Public Function GetCompleteImage() As Image
Dim bitmap As Bitmap = TryCast(Me.Image.Clone(), Bitmap)
For i As Integer = Me.Controls.Count - 1 To 0 Step -1
Me.Controls(i).DrawToBitmap(bitmap, Me.Controls(i).Bounds)
Next
Return bitmap
End Function
End Class
End Namespace
En este fragmento, creamos una
clase que extiende de PictureBox, añadiendo el método GetCompleteImage. Donde
se crea una copia de la imagen de fondo y se comienza a iterar a través de la
propiedad Controls de tipo ControlColecction. Obsérvese que se itera desde el
último elemento hasta el primero, teniendo el cuenta el Z-order (a los que han
trabajado con divs y css les debe sonar, y claro WPF ;-) ), el mismo esta
determinado por el índice del control en la colección. Posteriormente
utilizamos el método DrawToBitmap existente en la clase control, pasándole el
bitmap donde dibujaremos y el área donde se pintara dentro del mismo.