¿Cómo puedo configurar la opacidad o transparencia de un Panel en WinForms?
Me preguntaba cómo cambiar o modificar la transparencia de un Panel en C#, no todo el formulario, sino solo el panel. He visto muchos tutoriales de C# sobre Opacidad, pero es para el Formulario. Estoy buscando cómo podría ser posible solo con el Panel. ¡Gracias!
Para quien todavía esté buscando un panel totalmente transparente, encontré una buena solución en este blog de William Smash , quien a su vez la tomó de Tobias Hertkorn en su blog T# . Pensé que valía la pena publicarlo como respuesta aquí.
Código C#:
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);
}
}
Código VB.Net:
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
Sí, la opacidad sólo puede funcionar en ventanas de nivel superior. Utiliza una función de hardware del adaptador de vídeo que no admite ventanas secundarias, como Panel. La única clase derivada de Control de nivel superior en Winforms es Form.
Sin embargo, varios de los controles 'puros' de Winform, los que pintan ellos mismos en lugar de dejar que un control nativo de Windows haga el trabajo, admiten un BackColor transparente. Panel es uno de ellos. Utiliza un truco: le pide al padre que se dibuje a sí mismo para producir los píxeles de fondo. Un efecto secundario de este truco es que los controles superpuestos no funcionan, solo se ven los píxeles principales, no los controles superpuestos.
Este formulario de muestra lo muestra en funcionamiento:
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 eso no es suficiente, entonces debes considerar apilar formularios uno encima del otro. Como esto .
Quizás sea notable que esta restricción se elimine en Windows 8. Ya no utiliza la función de superposición del adaptador de video y DWM (también conocido como Aero) ya no se puede desactivar. Lo que hace que la opacidad/transparencia en ventanas secundarias sea fácil de implementar. Confiar en esto es, por supuesto, la música del futuro por un tiempo. Windows 7 será el próximo XP :)
Según la información encontrada en http://www.windows-tech.info/3/53ee08e46d9cb138.php , pude lograr un control de panel translúcido usando el siguiente código.
public class TransparentPanel : Panel
{
protected override CreateParams CreateParams
{
get
{
var 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 advertencia es que cualquier control que se agregue al panel tiene un fondo opaco. No obstante, el panel translúcido me resultó útil para bloquear partes de mi aplicación WinForms para que el enfoque de los usuarios se desplazara al área apropiada de la aplicación.