2016-03-19 18 views
1

üç ardışık katmanlar
picturebox1(.jpg) -> label1 -> picturebox2(.png transparent) ne ben istiyorum label1 picturebox2 görüyorum ama onun değil çalışma olabilir bu yüzden PictureBox1 Label1 ve şeffaf pictrurebox2 hale getirmektir .. C# ile iki şeffaf katman nasıl yapılır?

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

yüzden lütfen bana yardımcı vardır Eğer bir kontrol destek şeffaflık gerekiyorsa

+0

http://stackoverflow.com/questions/9358500/making-a-control-transparent –

+0

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

+0

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. –

cevap

2

, 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ı:

enter image description here

Ş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); 
    } 
} 
+0

ya resime ihtiyacım var ama bunu yapmak için herhangi bir içsel metform var mı? – arn48

+0

Windows form denetimlerinde bunun için yerleşik destek yoktur. Denetimleri özelleştirebilir veya bunun gibi yeni denetimler oluşturabilirsiniz. Metin ve görüntülere ihtiyacınız olduğunda başka bir seçenek olarak, GDI + kullanarak bir kontrolde birden çok katman oluşturabilir ve birden çok şeffaf kontrol kullanmanız gerekmez. –