透明背景显示为黑色

问题描述:

我试图让图像显示在另一个图像的顶部,仍然透过透明背景显示下方的图像。我已经得到它,所以新图像出现在另一个上面,但是将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

简而言之,您无法使用Windows窗体中的默认PictureBox控件轻松实现透明度。

要么切换到WPF,默认情况下它支持每个位的透明度,或者使用自定义控件。有一次,我创造了这样叫APPICON控制,但它是GPL,不是商业友好的下发布的,

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

enter image description here

对于形式,你可以试试这个:

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

希望这有助于

您可以通过设置“区域”特性很容易地创建一个形状不规则的形式。这里有一个例子:

Irregularly shaped form

至于真正透明的控制,这里有一步一步的指示的优秀资源:

Transparent Controls

它已经一段时间,但我认为你必须将您的表单设置为允许透明货币

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

即将摆脱黑色

如果你想覆盖(重于形式,而不是图像)在图像的图像,这将使窍门:

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

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

我有同样的问题,但我方才面板应该已经透明所以我可以看到它下面的一切。

问题出在DoubleBuffered属性,应该设置为false

this.DoubleBuffered = false;

没有黑暗了。