2012-03-11 23 views
5

Estoy tratando de hacer que una imagen aparezca encima de otra y aún mostrar la imagen debajo a través de un fondo transparente. Lo tengo así que la nueva imagen aparece una encima de la otra, sin embargo, al configurar BackColor en Color.Transparent solo resulta en un fondo negro.Fondo transparente que aparece negro

Código completo:

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

he encontrado una gran cantidad de personas que han tenido problemas similares, pero ninguna de las soluciones ayudado.

+1

Sí, la transparencia como la concibes no existe en realidad en WinForms. –

+0

De hecho. He estado luchando con las mismas cosas durante demasiado tiempo, solo descubriendo que wpf podría hacerlo sin casi ningún esfuerzo. – Silvermind

Respuesta

0

En palabras simples, no puede lograr transparencia con el control predeterminado PictureBox en Windows Forms.

O cambia a WPF, que de forma predeterminada admite transparencia en cada bit, o utiliza un control personalizado. Una vez que he creado un control tal llamada AppIcon, pero es liberado bajo la GPL, no es muy agradable comercial,

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

enter image description here

0

Para las formas que puede probar esto:

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

se puede tratar de resolverlo en el nivel de mapa de bits:

hacer una imagen en formato de mapa de bits y crea la backgroundColor transparente con este método:

 bm.MakeTransparent(Color.XXX); 

me pareció resolver un problema similar con la configuración de mi pantalla de bienvenida bij un temporizador cada 100 ms, y llamada DoEvents en ella:

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

Esperanza esto ayuda

0

Se puede crear un formulario de forma irregular fácilmente estableciendo su propiedad "Región". He aquí un ejemplo:

Irregularly shaped form

En cuanto a los controles verdaderamente transparentes, esto es un excelente recurso con instrucciones paso a paso:

Transparent Controls

3

ha sido un rato pero yo creo que hay que configurar el formulario para permitir Tranparencies

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

que deshacerse del negro

0

Si desea superponer imágenes más imágenes (y no las imágenes más de la forma), esto haría que el truco:

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

Dónde overImage y backimage son PictureBox con PNG (con fondo transparente).

1

tuve el mismo problema pero tenía sólo un panelque debería haber sido transparente para que pudiera ver todo lo que debajo de ella.

El problema era con DoubleBuffered propiedad, se debe establecer en falsa.

this.DoubleBuffered = false;

Sin negrura más.