, sen kontrolün boyama geçersiz kılmak ve bu sırada kontrolünü çizmek gerekir:
- aynı tüm denetimleri çizin Bir bitmap üzerinde kontrolünüz altında olan konteyner (z-endeksine göre).
- Daha sonra, kontrolünüzün grafikleri üzerinde bu bitmapi çizin.
- Son olarak kontrolünüzün içeriğini çizin.
- Ayrıca, denetiminizin
BackColor
'u Color.Transparent
olmalıdır.
İşte, TransparentLabel
ve TransparentPictureBox
denetimlerinin oluşturulmasının sonucudur. Aşağıdaki resimde, orada sırayla etiket, görüntü, etiket, görüntü ve ardından etikettir ve gördüğünüz gibi resim kutuları ve etiketleri şeffaf bir arka planda ve z-index saygı kılındığını:
Şeffaf Etiket
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);
}
}
Şeffaf 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<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);
}
}
http://stackoverflow.com/questions/9358500/making-a-control-transparent –
Konumlandırma konusunda emin değilsiniz, ancak muhtemelen etiketi bir çocuk olmak için pb2 yapmalısınız, yani tüm denetimler bir iç içe geçmiş tarafından yazılmalıdır. bir. Bunun anlamı: Üstüste binme yok! – TaW
Yalnızca, Ebeveyn, yığınlama efektlerinin çalışmadığını görebilirsiniz. En basit çözüm, TextRenderer.DrawText() yöntemini PictureBox1'in Paint olayı yerine bir Etiket kullanmaktır. Ayrıca çok daha ucuz, ama kod yazmanız gerekiyor. Orada btw durdurmak gerek yok, şimdi de bu olayda Graphics.DrawImage() kullanabilirsiniz ve artık pictureBox2 gerekmez. –