2012-03-11 268 views
5

我試圖讓圖像顯示在另一個圖像的頂部,仍然透過透明背景顯示下方的圖像。我已經得到它,所以新圖像出現在另一個上面,但是將BackColor設置爲Color.Transparent只會導致黑色背景。透明背景顯示爲黑色

全碼:

public partial class frm_airportApplication : Form 
{ 
    PictureBox PicBox; 
    public frm_airportApplication() 
    { 
     InitializeComponent(); 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x000000200; 
      return cp; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     AllowTransparency = true; 
     plane p = new plane(); 
     p.getPB().Parent = pb_airport; 
     this.Controls.Add(p.getPB()); 
     this.Update(); 
    } 
    protected void InvalidateEx() 
    { 
     if (Parent == null) 
      return; 
     Rectangle rc = new Rectangle(this.Location, this.Size); 
     Parent.Invalidate(rc, true); 
    } 
    protected override void OnPaintBackground(PaintEventArgs pevent) 
    { 
     //do not allow the background to be painted 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     AllowTransparency = true; 
     ResourceManager resourceManager = new ResourceManager("Airport_Application.Properties.Resources", GetType().Assembly); 
     PicBox = new PictureBox(); 
     PicBox.BackColor = Color.Transparent; 
     PicBox.Image = (Bitmap)resourceManager.GetObject("plane_icon"); 
     PicBox.Top = 100; 
     PicBox.Width = 120; 
     PicBox.Height = 120; 
     PicBox.Left = 10; 
     PicBox.SizeMode = PictureBoxSizeMode.Zoom; 

     PicBox.Parent = pb_airport; 
     Controls.Add(PicBox); 
     PicBox.BringToFront(); 
    } 
} 
public class plane 
{ 
    PictureBox pb; 
    Bitmap image; 
    ResourceManager resourceManager; 
    public plane() 
    { 
     resourceManager = new ResourceManager("Airport_Application.Properties.Resources", GetType().Assembly); 
     image=(Bitmap)resourceManager.GetObject("plane_icon"); 
     pb = new PictureBox(); 
     pb.Image = image; 
     pb.Top = 500; 
     pb.Width = 100; 
     pb.Height = 100; 
     pb.Left = 50; 
     pb.SizeMode = PictureBoxSizeMode.Zoom; 
     pb.BackColor = Color.Transparent; 
    } 
    public PictureBox getPB() 
    { 
     return pb; 
    } 
} 

我發現了很多誰也有類似的問題,但沒有解決方案的幫助的人。

+1

是的,你設想它的透明度實際上並不存在於WinForms中。 – 2012-03-11 08:16:44

+0

確實。我一直在苦苦掙扎,只是發現wpf幾乎沒有任何努力就能做到。 – Silvermind 2012-03-11 10:12:45

回答

0

簡而言之,您無法使用Windows窗體中的默認PictureBox控件輕鬆實現透明度。

要麼切換到WPF,默認情況下它支持每個位的透明度,或者使用自定義控件。有一次,我創造了這樣叫APPICON控制,但它是GPL,不是商業友好的下發布的,

http://mymobilepack.codeplex.com/SourceControl/changeset/view/39314#512415

enter image description here

0

對於形式,你可以試試這個:

 this.BackColor = System.Drawing.Color.XXX; 
     this.TransparencyKey = System.Drawing.Color.XXX; 

您可以嘗試解決它的位圖級別:

使位圖格式的圖像,使的backgroundColor TRANSPARANT用這種方法:

 bm.MakeTransparent(Color.XXX); 

我似乎解決了類似的問題,我的啓動畫面BIJ設置計時器每100ms, 和呼叫的DoEvents在它:

private void timer1_Tick(object sender, EventArgs e) 
    { 
     //BringToFront(); 
     Application.DoEvents(); 
    } 

希望這有助於

0

您可以通過設置「區域」特性很容易地創建一個形狀不規則的形式。這裏有一個例子:

Irregularly shaped form

至於真正透明的控制,這裏有一步一步的指示的優秀資源:

Transparent Controls

3

它已經一段時間,但我認爲你必須將您的表單設置爲允許透明貨幣

this.AllowTransparency = true; 
or 
YourForm.AllowTransparency = true; 

即將擺脫黑色

0

如果你想覆蓋(重於形式,而不是圖像)在圖像的圖像,這將使竅門:

overImage.Parent = backImage; 
overImage.BackColor = Color.Transparent; 
overImage.Location = thePointRelativeToTheBackImage; 

其中overImage和backImage是與png(具有透明背景)PictureBox。

1

我有同樣的問題,但我方纔面板應該已經透明所以我可以看到它下面的一切。

問題出在DoubleBuffered屬性,應該設置爲false

this.DoubleBuffered = false;

沒有黑暗了。