¿Algún truco para usar la opacidad en un panel en Visual Studio Window Form?

Recientemente empecé a explorar Visual Studio. Estaba tratando de crear un menú de diapositivas. Más específicamente, cuando el usuario presione el botón, aparecerá un submenú a la derecha. Para lograrlo he colocado un Panel para redimensionarlo. Aparte de la funcionalidad, quería agregar un poco más de diseño y hacer que el Panel pareciera un poco difuminado.

Sé que Panels en Visual Studio no tiene opacidad, pero pensaba que si alguien sabe una forma de truco acerca 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?

  1. Crea una clase que hereda 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. Reemplace 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 ocultas por la ventana. Una ventana creada con este estilo recibe mensajes WM_PAINT solo después de que se hayan actualizado todas las ventanas de hermanos que se encuentran debajo.

  1. Cree una propiedad de Opacity que acepte valores de 0 a 100 que se utilizarán como canal alfa de fondo.
  2. Sobrescriba OnPaint y complete el fondo utilizando un Brush alfa habilitado 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

introduzca la descripción de la imagen aquí

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 semi-transparencia, 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); } 

Panel semitransparente

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