web-dev-qa-db-fra.com

Fond transparent sur les winforms?

Je voulais rendre mon formulaire Windows transparent, j'ai donc supprimé les bordures, les contrôles et tout ce qui ne laissait que la boîte de formulaires, puis j'ai essayé de rendre BackColor et TransparencyKey transparent mais cela n'a pas fonctionné car BackColor n'accepterait pas la couleur transparente. Après avoir cherché autour de moi, j'ai trouvé ceci sur msdn:

SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
this.TransparencyKey = BackColor;

Malheureusement, cela n'a pas fonctionné non plus. J'obtiens toujours le gris ou tout autre fond de couleur sélectionné.

Tout ce que je voulais faire, c'était que le formulaire Windows soit transparent afin que je puisse utiliser une image d'arrière-plan qui agirait comme si c'était mon formulaire Windows.

J'ai cherché ici et j'ai vu de nombreux sujets concernant l'opacité qui n'est pas ce que je recherche et j'ai également vu certains concernant cette méthode que j'essayais mais je n'ai pas encore trouvé de réponse.

J'espère que n'importe qui peut éclairer mon chemin.

MISE À JOUR:

image supprimée lorsque le problème est résolu

38
Prix

La méthode que j'ai utilisée auparavant consiste à utiliser une couleur sauvage (une couleur que personne sensé n'utiliserait) pour le BackColor, puis définir la clé de transparence à cela.

this.BackColor = Color.LimeGreen;
this.TransparencyKey = Color.LimeGreen;
66
Joel Etherton

Une solution simple pour obtenir un arrière-plan transparent dans un formulaire Windows est d'écraser la méthode OnPaintBackground comme ceci:

protected override void OnPaintBackground(PaintEventArgs e)
{
    //empty implementation
}

(Notez que la base.OnpaintBackground(e) est supprimée de la fonction)

21
Alexander Cosman

Voici ma solution:

Dans les constructeurs, ajoutez ces deux lignes:

        this.BackColor = Color.LimeGreen;
        this.TransparencyKey = Color.LimeGreen;

Dans votre formulaire, ajoutez cette méthode:

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.LimeGreen, e.ClipRectangle);
    }

Soyez averti, non seulement ce formulaire est entièrement transparent à l'intérieur du cadre, mais vous pouvez également cliquer dessus. Cependant, il peut être intéressant de dessiner une image dessus et de faire glisser le formulaire partout pour créer un formulaire personnalisé.

7
AyrA

J'ai essayé les solutions ci-dessus (et aussi) de nombreuses autres solutions à partir d'autres postes.

Dans mon cas, je l'ai fait avec la configuration suivante:

public partial class WaitingDialog : Form
{
    public WaitingDialog()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;

        // Other stuff
    }

    protected override void OnPaintBackground(PaintEventArgs e) { /* Ignore */ }
}

Comme vous pouvez le voir, il s'agit d'un mélange de réponses données précédemment.

6
Joel

Ma solution était extrêmement proche de celle de Joel (pas Etherton, tout simplement Joel):

public partial class WaitingDialog : Form
{
    public WaitingDialog()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;
        this.TransparencyKey = Color.Transparent; // I had to add this to get it to work.

        // Other stuff
    }

    protected override void OnPaintBackground(PaintEventArgs e) { /* Ignore */ }
}
4
roncli

J'ai essayé presque tout cela. mais ne pouvait toujours pas fonctionner. Enfin, j'ai trouvé que c'était à cause de problèmes de 24 bits. Si vous avez essayé un bitmap inférieur à 24 bits. La plupart de ces méthodes ci-dessus devraient fonctionner.

2
Zhi

J'avais dessiné un écran de démarrage (32 bpp BGRA) avec une couleur de fond "transparente" dans VS2013 et mis une PictureBox sous une forme d'affichage. Pour moi, une combinaison des réponses ci-dessus a fonctionné:

    public Form1()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = this.pictureBox1.BackColor;
        this.TransparencyKey = this.pictureBox1.BackColor;
    }

Assurez-vous donc que vous utilisez la même BackColor partout et définissez cette couleur comme TransparencyKey.

2
MaLe

Ce qui fonctionne pour moi, c'est d'utiliser une couleur spécifique au lieu de la capacité réelle de .png à représenter la transparence.

Donc, ce que vous pouvez faire, c'est prendre votre image de fond et peindre la zone transparente avec une couleur spécifique (le magenta m'a toujours semblé approprié ...).

Définissez l'image comme propriété BackgrounImage du formulaire et définissez la couleur comme TransparencyKey du formulaire. Pas besoin de changements dans le style du contrôle, et pas besoin de BackColor.

Je l'ai essayé en ce moment et cela a fonctionné pour moi ...

1
Ran