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

Hay tres capas consecutivas
picturebox1(.jpg) -> label1 -> picturebox2(.png transparent) lo que quiero es hacer que la etiqueta1 y pictrurebox2 sean transparentes para picturebox1 para que la etiqueta1 se pueda ver a través de 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 ayudame

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á bajo su control (basado en el índice z) en un bitmap.
  • Luego dibuja ese bitmap en los gráficos de tu control.
  • Por último dibuja el contenido de tu control.
  • Además, BackColor de su control debe ser Color.Transparent .

Este es el resultado de crear controles TransparentLabel y TransparentPictureBox . En la imagen de abajo, hay una etiqueta, imagen, etiqueta, imagen y luego etiqueta en orden y, como puede ver, los cuadros de imagen y las tags se han renderizado teniendo un fondo transparente y respetando el índice Z:

enter image description here

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() .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); } } 

Transparente PictureBox

 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() .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); } }