Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - RIVASBROTHERS

#1
Antes que todo disculparme por que la respuesta esta en C#, pero para lograr su objetivo puede hacer uso de la propiedad WS_EX_LAYERED, algo como esto:

Código (csharp) [Seleccionar]


public const int WS_EX_LAYERED = 0x00080000;

protected override CreateParams CreateParams
{
   get
   {
       CreateParams createParams = base.CreateParams;

       if (DesignMode) return createParams;

       //Habilita el modo transparente del formulario
       createParams.ExStyle |= WS_EX_LAYERED;
       return createParams;
   }
}



Y luego dibujar los grafico sobre un bitmap y dibujar este bitmap sobre el formulario a través de un metodo de dibujo especial tal como se muestra en este articulo https://www.codeproject.com/Articles/1822/Per-Pixel-Alpha-Blend-in-C, puede hacerlo de esta manera:

Código (csharp) [Seleccionar]


//Ejecuta el evento al cargar el formulario
protected override void OnLoad(EventArgs e)
{
   base.OnLoad(e);
   HandledPaintEvent();
}

private void HandledPaintEvent()
{
   var rect = new Rectangle(Point.Empty, this.Size);
   //Crea un objeto bitmap y obtiene los graficos
   var bmp = new Bitmap(this.Width, this.Height, PixelFormat.Format32bppArgb);
   using (Graphics g = Graphics.FromImage(bmp))
   {
       //Dibuja el fondo del form
       using (LinearGradientBrush br = new LinearGradientBrush(ClientRectangle, Color.Red, Color.Transparent, LinearGradientMode.Vertical))
       {
           g.FillRectangle(br, rect);
       }
   }

   //Dibuja los controles sobre el bitmap
   foreach (Control c in this.Controls)
   {
       if (c.Visible)
       {
           c.DrawToBitmap(bmp, c.Bounds);
       }
   }

   //Metodo para dibujar el bitmap sobre el form  (Mas Info: https://www.codeproject.com/Articles/1822/Per-Pixel-Alpha-Blend-in-C)
   this.SetBitmap(bmp, 100);
}



De esta manera obtiene el mismo resultado de la imagen que encontro en google:



Los problemas que se presentan son los siguientes:

*Se debe redibujar el bitmap cada vez que el formulario cambia de tamaño o ejecute un evento importante que requiera redibujo.
*Los controles quedan estaticos a menos que actualice el bitmap cada vez que se ejecute un evento  mouseHover, mouseLeave o mouseDown sobre cada control.
*El metodo DrawToBitmap no soporta transparencia por ello aunque se asigna el fondo transparente a cada control siempre devuelve el fondo por defecto que tendria el formulario en el caso que no fuera WS_EX_LAYERED.

Saludos desde El Salvador.