Прозрачный фон, показывая вверх черный - PullRequest
5 голосов
/ 11 марта 2012

Я пытаюсь заставить изображение появиться поверх другого и по-прежнему показывать изображение внизу через прозрачный фон.У меня так получилось, что новое изображение появляется поверх другого, однако при установке 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 ]

3 голосов
/ 30 марта 2012

Это было какое-то время, но я думаю, что вы должны установить форму «Разрешить прозрачности»

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

, которая избавит от черного

2 голосов
/ 31 мая 2016

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

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

this.DoubleBuffered = false;

Черноты больше нет.

1 голос
/ 30 марта 2012

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

Форма неправильной формы

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

Прозрачные элементы управления

0 голосов
/ 12 февраля 2014

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

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

Где overImage и backImage - PictureBox с png (с прозрачным фоном).

0 голосов
/ 30 марта 2012

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

Либо вы переключаетесь на WPF, который по умолчанию поддерживает прозрачность в каждом бите, либо используете пользовательский элемент управления. Однажды я создал такой элемент управления под названием AppIcon, но он выпущен под лицензией GPL, а не для коммерческого использования,

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

enter image description here

0 голосов
/ 30 марта 2012

Для форм вы можете попробовать это:

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

Вы можете попытаться решить ее на уровне растрового изображения:

Создайте изображение в растровом формате и сделайте фоновый цвет прозрачным с помощью этого метода.:

        bm.MakeTransparent(Color.XXX); 

Похоже, я решил аналогичную проблему, установив таймер каждые 100 мс для моего экрана-заставки и вызывая DoEvents:

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...