我正在尝试将图像显示在另一个图像的顶部,并仍然通过透明背景显示图像。我已经得到它,所以新图像显示在另一个上面,但将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;
}
}
我发现很多人遇到类似的问题,但没有一个解决方案有帮助。
答案 0 :(得分:3)
已经有一段时间,但我认为您必须将表单设置为允许传输
this.AllowTransparency = true;
or
YourForm.AllowTransparency = true;
将摆脱黑色
答案 1 :(得分:2)
我遇到了同样的问题,但我只有一个 Panel ,它应该透明,所以我可以看到它下面的所有内容。
问题出在 DoubleBuffered 属性上,应该设置为 false 。
this.DoubleBuffered = false;
不再是黑人。
答案 2 :(得分:1)
您可以通过设置“Region”属性轻松创建不规则形状的表单。这是一个例子:
对于真正透明的控件,这里有一个很好的资源,并带有分步说明:
答案 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
答案 5 :(得分:0)
如果你想在图像上叠加图像(而不是在图像上叠加图像),这就可以解决问题:
overImage.Parent = backImage;
overImage.BackColor = Color.Transparent;
overImage.Location = thePointRelativeToTheBackImage;
其中overImage和backImage是带有png的PictureBox(具有透明背景)。