出现黑色的透明背景

时间:2012-03-11 08:10:42

标签: c# .net user-interface

我正在尝试将图像显示在另一个图像的顶部,并仍然通过透明背景显示图像。我已经得到它,所以新图像显示在另一个上面,但将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;
    }
}

我发现很多人遇到类似的问题,但没有一个解决方案有帮助。

6 个答案:

答案 0 :(得分:3)

已经有一段时间,但我认为您必须将表单设置为允许传输

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

将摆脱黑色

答案 1 :(得分:2)

我遇到了同样的问题,但我只有一个 Panel ,它应该透明,所以我可以看到它下面的所有内容。

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

this.DoubleBuffered = false;

不再是黑人。

答案 2 :(得分:1)

您可以通过设置“Region”属性轻松创建不规则形状的表单。这是一个例子:

Irregularly shaped form

对于真正透明的控件,这里有一个很好的资源,并带有分步说明:

Transparent Controls

答案 3 :(得分:0)

对于表单,您可以尝试:

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

您可以尝试在位图级别上解决它:

以位图格式制作图像,并使用此方法使backgroundcolor透明化:

        bm.MakeTransparent(Color.XXX); 

我似乎解决了类似的问题,我的splashscreen bij每隔100ms设置一个计时器, 并在其中调用DoEvents:

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

希望这有帮助

答案 4 :(得分:0)

简单来说,使用Windows窗体中的默认PictureBox控件无法轻松实现透明度。

要么切换到WPF,默认情况下支持每个位的透明度,要么使用自定义控件。一旦我创建了一个名为AppIcon的控件,但它是在GPL下发布的,不是商业友好的,

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

enter image description here

答案 5 :(得分:0)

如果你想在图像上叠加图像(而不是在图像上叠加图像),这就可以解决问题:

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

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