c# .net winforms custom-controls gdi+

¿Cómo hacer dos capas transparentes con c#?



.net winforms (1)

Si necesita una transparencia de soporte de control, debe anular la pintura del control y dibujar el control en este orden:

  • Dibuje todos los controles en el mismo contenedor que están bajo su control (basado en el índice z) en un mapa de bits.
  • Luego dibuje ese mapa de bits en los gráficos de su control.
  • Por fin dibuja el contenido de tu control.
  • También el BackColor de su control debe ser Color.Transparent .

Aquí está el resultado de crear controles TransparentLabel y TransparentPictureBox . En la imagen a continuación, hay una etiqueta, una imagen, una etiqueta, una imagen y luego una etiqueta en orden y, como puede ver, los cuadros de imagen y las etiquetas se han renderizado con fondo transparente y respetando el índice z:

Etiqueta transparente

class TransparentLabel : Label { public TransparentLabel() { this.BackColor = Color.Transparent; } protected override void OnPaint(PaintEventArgs e) { if (Parent != null && this.BackColor == Color.Transparent) { using (var bmp = new Bitmap(Parent.Width, Parent.Height)) { Parent.Controls.Cast<Control>() .Where(c => Parent.Controls.GetChildIndex(c) > Parent.Controls.GetChildIndex(this)) .Where(c => c.Bounds.IntersectsWith(this.Bounds)) .OrderByDescending(c => Parent.Controls.GetChildIndex(c)) .ToList() .ForEach(c => c.DrawToBitmap(bmp, c.Bounds)); e.Graphics.DrawImage(bmp, -Left, -Top); } } base.OnPaint(e); } }

PictureBox transparente

class TransparentPictureBox : PictureBox { public TransparentPictureBox() { this.BackColor = Color.Transparent; } protected override void OnPaint(PaintEventArgs e) { if (Parent != null && this.BackColor==Color.Transparent) { using (var bmp = new Bitmap(Parent.Width, Parent.Height)) { Parent.Controls.Cast<Control>() .Where(c => Parent.Controls.GetChildIndex(c) > Parent.Controls.GetChildIndex(this)) .Where(c => c.Bounds.IntersectsWith(this.Bounds)) .OrderByDescending(c => Parent.Controls.GetChildIndex(c)) .ToList() .ForEach(c => c.DrawToBitmap(bmp, c.Bounds)); e.Graphics.DrawImage(bmp, -Left, -Top); } } base.OnPaint(e); } }

Hay tres capas consecutivas,
picturebox1(.jpg) -> label1 -> picturebox2(.png transparent) lo que quiero es hacer que la etiqueta1 y pictrurebox2 sean transparentes para la picturebox1 para que la etiqueta1 se pueda ver a través de la picturebox2 pero no funciona.

public Form1() { InitializeComponent(); label1.Parent = pictureBox1; label1.BackColor = Color.Transparent; pictureBox2.Parent = pictureBox1; pictureBox2.BackColor = Color.Transparent; picturebox2.BringToFront(); }

así que por favor ayúdame