Comment définir l'opacité ou la transparence d'un panneau dans WinForms?

je me demandais comment changer ou modifier la transparence d'un panneau en C#, pas la forme entière, mais le panneau seulement.. J'ai vu beaucoup de tutoriels sur L'opacité, mais c'est pour la forme. je cherche comment il pourrait être possible avec le Panneau. Je Vous Remercie!

40
demandé sur Cody Gray 2010-12-16 20:01:41

9 réponses

Oui, l'opacité ne peut fonctionner que sur les fenêtres de niveau supérieur. Il utilise une fonctionnalité matérielle de l'adaptateur vidéo, qui ne supporte pas les fenêtres enfant, comme le Panneau. La seule classe dérivée de contrôle de premier niveau dans Winforms est la forme.

plusieurs des commandes Winform 'pures', celles qui font leur propre peinture au lieu de laisser une fenêtre native contrôler faire le travail, supportent cependant une Rétrocolor transparente. Le panneau est l'un d'entre eux. Il utilise un truc, il demande au Parent de se dessiner pour produire le pixel d'arrière-plan. Un effet secondaire de cette astuce est que le chevauchement des contrôles ne fonctionne pas, vous ne voyez que les pixels parents, pas les contrôles superposés.

Cet exemple montre une forme au travail:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.BackColor = Color.White;
        panel1.BackColor = Color.FromArgb(25, Color.Black);
    }
    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100);
    }
}

si ce n'est pas suffisant, vous devez envisager d'empiler les formulaires les uns sur les autres. Comme ceci.

il est peut-être intéressant de noter que cette restriction est levée dans Windows 8. Il n'utilise plus la fonction de superposition d'adaptateur vidéo et DWM (alias Aero) ne peut plus être éteint. Ce qui rend opacité/transparence sur les fenêtres enfant facile à mettre en œuvre. S'en remettre à cela est bien sûr de l'avenir-musique pour un certain temps à venir. Windows 7 sera le prochain XP :)

32
répondu Hans Passant 2014-04-04 10:00:00
ce blog de William Smash qui à son tour a pris Tobias Hertkorn sur son T # blog. J'ai pensé qu'il valait la peine de le poster comme une réponse ici.

C # code:

public class TransparentPanel : Panel
{
    protected override CreateParams CreateParams 
    {            
        get {
            CreateParams cp =  base.CreateParams;
            cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return cp;
            }
    }
    protected override void OnPaintBackground(PaintEventArgs e) 
    {
        //base.OnPaintBackground(e);
    }
}

VB.Net code:

Public Class TransparentPanel
Inherits Panel
    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or &H20 ''#WS_EX_TRANSPARENT
            Return cp
        End Get
    End Property
    Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
    ''#MyBase.OnPaintBackground(e)
    End Sub
End Class
38
répondu Abdusalam Ben Haj 2013-03-20 12:27:19

basé sur des informations trouvées à http://www.windows-tech.info/3/53ee08e46d9cb138.php, j'ai pu réaliser un contrôle de panneau translucide en utilisant le code suivant.

public class TransparentPanel : Panel
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);
    }
}

la mise en garde est que tous les contrôles qui sont ajoutés au panneau ont un fond opaque. Néanmoins, le panneau translucide a été utile pour moi de bloquer des parties de mon application WinForms afin que les utilisateurs se concentrent sur le domaine approprié de l'application.

10
répondu Brian Hasden 2014-01-30 21:40:20

autant Que je sache, le Panneau peut avoir une couleur transparente seulement, vous ne pouvez pas contrôler l'opacité du panneau. Donc, vous pouvez avoir certaines parties d'un panneau complètement transparent, mais pas un 50% pour dire quelque chose.

Pour utiliser la transparence, vous devez définir la propriété "couleur transparente".

3
répondu Ignacio Soler Garcia 2010-12-16 17:25:11

essaye ceci:

panel1.BackColor = Color.FromArgb(100, 88, 44, 55);

changement d'alpha(A) pour obtenir l'opacité voulue.

3
répondu Dark Knight 2014-09-19 01:48:03

N'oubliez pas d'apporter votre Panneau à l'Avant lors de la création dynamique dans le constructeur du formulaire. Exemple de superposition transparente du panneau de Contrôle tab.

panel1 = new TransparentPanel();
panel1.BackColor = System.Drawing.Color.Transparent;
panel1.Location = new System.Drawing.Point(0, 0);
panel1.Name = "panel1";
panel1.Size = new System.Drawing.Size(717, 92);
panel1.TabIndex = 0;
tab2.Controls.Add(panel1);
panel1.BringToFront(); 

/ / < = = autrement les autres contrôles peignent au-dessus du panneau transparent

2
répondu Bill Moore 2016-02-19 18:52:06

je voulais juste ajouter à la solution de William Smash Car je ne pouvais pas obtenir à son blog donc les réponses qui ont pu être là-dedans à mes questions simples n'ont pas pu être trouvées.

si vous n'avez pas déjà eu à le faire, vous devrez ajouter une référence au système.Windows.Formulaires dans les propriétés du projet.

vous devrez aussi ajouter

Imports System.Windows.Forms 

au fichier où vous ajoutez remplacer classe.

pour OnPaintBackground vous devrez ajouter une référence pour le système.Le dessin puis

Imports System.Drawing.Printing.PrintEventArgs
0
répondu Dan 2015-06-10 13:53:31

certains commentaires disent que ça marche et d'autres que ça ne marche pas Il ne fonctionne que pour votre form arrière-plan, pas d'autre controls derrière

0
répondu Ahmed Taha 2018-01-05 07:23:47

cela fonctionne pour moi. Dans l'exemple ci-dessous, la plage Alpha peut être une valeur entre 0 et 255. Auparavant, j'ai fait une erreur en pensant qu'il doit être une valeur de pourcentage.

Dim x as integer = 230 Panel1.BackColor = Color.FromArgb(x, Color.Blue)

-1
répondu umami 2017-01-06 06:31:02