¿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 serColor.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