2012-03-11 4 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. –

+0

Действительно. Я слишком долго боролся с одними и теми же вещами, но только выяснение того, что wpf может сделать это почти без усилий. – Silvermind

ответ

0

Простыми словами вы не можете легко добиться прозрачности с помощью элемента управления PictureBox по умолчанию в Windows Forms.

Либо вы переключаетесь на 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 транспаранта с помощью этого метода:

 bm.MakeTransparent(Color.XXX); 

я, казалось, решить подобную проблему с моим SplashScreen бий установки таймера каждые 100 мс, и вызов DoEvents в нем:

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

Надеется, что это помогает

0

Вы можете создать неправильную форму формы легко, установив его свойство «Регион». Вот пример:

Irregularly shaped form

Что касается действительно прозрачных элементов управления, здесь отличный ресурс шаг за шагом инструкции:

Transparent Controls

3

Прошло некоторое время, но я думаю, что вы должны установить форму Разрешить Tranparencies

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

, что бы избавиться от черного

0

Если вы хотите наложить изображения над изображениями (а не изображения по форме), это сделало бы трюк:

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

Где overImage и backImage являются PictureBox с PNG (с прозрачным фоном).

1

Я была такая же проблема, но у меня была только панель, который должен был прозрачной, так что я мог видеть все, что под ним.

Проблема была с DoubleBuffered свойство, оно должно быть установлено в ложной.

this.DoubleBuffered = false;

Нет черноту больше.

Смежные вопросы