Foros del Web » Programación para mayores de 30 ;) » .NET »

Panel en frente de TODOS los controles hijos

Estas en el tema de Panel en frente de TODOS los controles hijos en el foro de .NET en Foros del Web. Hola a todos, Estoy haciendo una aplicación de windows en c# en la que necesito que cuando se abra una ventana de dialogo, aparezca un ...
  #1 (permalink)  
Antiguo 26/12/2009, 10:21
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Panel en frente de TODOS los controles hijos

Hola a todos,

Estoy haciendo una aplicación de windows en c# en la que necesito que cuando se abra una ventana de dialogo, aparezca un panel con semi-transparencia entre la ventana de dialogo y la ventana padre, igual que lo hacen muchos frameworks js para de la web.
El problema que tengo es que el panel se dibuja en frente de los controles hijos, pero NO en frente de los hijos de estos controles.
La interfaz que por ahora estoy manejando es muy simple: tengo un panel que contiene un menu. Este menu tiene botones (sus controles hijos).
Uno de estos botones es el que abre la ventana dialogo. Cuando esto pasa el panel queda entre el menu y los botones del menu, es decir, oculta el fondo del menu, pero los botones siguen apareciendo por encima del panel.
Las clases relevantes son las siguientes:

PopupBackScreen.cs
Código C#:
Ver original
  1. public class PopupBackScreen : Panel
  2.     {
  3.         private SolidBrush backBrush;
  4.  
  5.         public PopupBackScreen()
  6.         {
  7.             backBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 0));
  8.         }
  9.  
  10.         protected override CreateParams CreateParams
  11.         {
  12.             get
  13.             {
  14.                 System.Windows.Forms.CreateParams createParams = base.CreateParams;
  15.                 createParams.ExStyle |= 0x20;
  16.  
  17.                 return createParams;
  18.             }
  19.         }
  20.  
  21.         protected override void OnPaint(PaintEventArgs e)
  22.         {
  23.             e.Graphics.FillRectangle(backBrush, this.ClientRectangle);
  24.         }
  25.  
  26.     }

ScreenManager.cs
Código C#:
Ver original
  1. ...
  2.         public ScreenParams Popup(Popups.PopupType popup)
  3.         {
  4.             if (!popups.ContainsKey(popup))
  5.             {
  6.                 popups.Add(popup, Popups.CreateInstance(popup));                
  7.             }
  8.  
  9.             currentScreen.Controls.Add(popupBackScreen);
  10.             popupBackScreen.Dock = DockStyle.Fill;
  11.             popupBackScreen.BringToFront();
  12.             currentScreen.PerformLayout();
  13.            
  14.             UI.Popup wnd = popups[popup];
  15.             wnd.ShowDialog();
  16.            
  17.             currentScreen.Controls.Remove(popupBackScreen);
  18.  
  19.             return wnd.Config;
  20.         }
  21. ...

Como verán, agrego el control a la pantalla que está activa en ese momento (currentScreen no es más que un panel para agrupar controles, en este caso es el panel que contiene el menu). Luego ajusto al ancho de la pantalla el popupBackScreen y lo muestro delante de todo (aunque esto último es lo que no está funcionando).
Entonces, ¿cómo hago para que el panel se muestre realmente en frente de todo?.

Muchas gracias.
Saludos y felicidades en estas fiestas.
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 27/12/2009, 19:39
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Respuesta: Panel en frente de TODOS los controles hijos

La solución es no sobreescribir la propiedad CreateParams y evitar que se pinte el background del panel. La clase quedaría de la siguiente forma:

Código C#:
Ver original
  1. public class PopupBackScreen : Panel
  2.     {
  3.         private SolidBrush backBrush;
  4.  
  5.         public PopupBackScreen()
  6.         {
  7.             backBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 0));
  8.         }
  9.  
  10.         protected override void OnPaintBackground(PaintEventArgs e)
  11.         {
  12.             /** No llamar base.OnPaintBackground(e) para evitar que se pinte el fondo */
  13.         }
  14.  
  15.         protected override void OnPaint(PaintEventArgs e)
  16.         {
  17.             base.OnPaint(e);
  18.             e.Graphics.FillRectangle(backBrush, this.ClientRectangle);            
  19.         }
  20.  
  21.     }

Espero que le sirva a alguien.
Muchas gracias a todos los que se tomaron el tiempo de leer el post.

Saludos.
__________________
Add, never Remove
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:23.