c# .net winforms panel opacity

c# - ¿Algún truco para usar la opacidad en un panel en el formulario de ventana de Visual Studio?



.net winforms (2)

  1. Cree una clase que herede del Panel .
  2. Establezca el estilo ControlStyle.Opaque para el control en el constructor.

Si es verdadero, el control se dibuja opaco y el fondo no se pinta.

  1. CreateParams y establezca el estilo WS_EX_TRANSPARENT para ello.

Especifica que una ventana creada con este estilo debe ser transparente. Es decir, las ventanas que están debajo de la ventana no están oscurecidas por la ventana. Una ventana creada con este estilo recibe mensajes WM_PAINT solo después de que todas las ventanas hermanas debajo de ella se hayan actualizado.

  1. Cree una propiedad de Opacity que acepte valores de 0 a 100 que se utilizarán como canal alfa de fondo.
  2. OnPaint y llene el fondo con un Brush habilitado alfa que se crea a partir de BackGroundColor y BackGroundColor .

Código completo

public class ExtendedPanel : Panel { private const int WS_EX_TRANSPARENT = 0x20; public ExtendedPanel() { SetStyle(ControlStyles.Opaque, true); } private int opacity = 50; [DefaultValue(50)] public int Opacity { get { return this.opacity; } set { if (value < 0 || value > 100) throw new ArgumentException("value must be between 0 and 100"); this.opacity = value; } } protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT; return cp; } } protected override void OnPaint(PaintEventArgs e) { using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor))) { e.Graphics.FillRectangle(brush, this.ClientRectangle); } base.OnPaint(e); } }

Captura de pantalla

Recientemente comencé a explorar Visual Studio. Estaba tratando de crear un menú de diapositivas. Más específicamente, cuando el usuario presiona el botón, aparece un submenú a la derecha. Para lograrlo, coloqué un Panel para cambiar su tamaño. Además de la funcionalidad, quería agregar un poco más de diseño y hacer que el Panel pareciera un poco desvaído.

Sé que los Panels en Visual Studio no tienen opacidad, pero estaba pensando si alguien conoce una idea de truco de cómo se puede lograr. Probé un Picture Box pero eso tampoco tenía Opacidad como propiedad. Evité usar el objeto de Menu normal que ofrece Visual Studio porque quería agregar más diseño. ¿Algunas ideas?


Para hacer que un control sea "transparente", debe pintar el área correcta de su padre en el control. Eso es lo que hace el Button antes de dibujar su contenido para que las esquinas redondeadas sean transparentes.

Para imitar la semitransparencia, puede pintar el formulario en el panel y luego dibujar algo con Alpha:

private void panel1_Paint(object sender, PaintEventArgs e) { PaintTransparentBackground(panel1, e); using (Brush b = new SolidBrush(Color.FromArgb(128, panel1.BackColor))) { e.Graphics.FillRectangle(b, e.ClipRectangle); } } private static void PaintTransparentBackground(Control c, PaintEventArgs e) { if (c.Parent == null || !Application.RenderWithVisualStyles) return; ButtonRenderer.DrawParentBackground(e.Graphics, c.ClientRectangle, c); }

Tenga en cuenta que ButtonRenderer.DrawParentBackground no pinta los controles del formulario, que se superponen con el panel, sino solo el fondo del formulario.