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:
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:
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.
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.