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!
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 :)
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
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.
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".
essaye ceci:
panel1.BackColor = Color.FromArgb(100, 88, 44, 55);
changement d'alpha(A) pour obtenir l'opacité voulue.
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
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
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
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)