Pregunta

¿Hay una manera de añadir una sombra a los controles?

¿existen controles por ahí con esta característica?

¿Fue útil?

Solución

Esta pregunta ha sido de alrededor de 6 años y necesita una respuesta. Espero que cualquiera que necesite hacer esto se puede extrapolar una respuesta para cualquier conjunto de control de mi solución. Tenía un panel y quería dibujar una sombra debajo de cada control secundario -. En este caso uno o más paneles (pero la solución debe mantener buena para otros tipos de control con algunos cambios menores en el código)

A medida que la sombra de la gota para un control se ha de elaborar en la superficie del recipiente de que el control que empezar por la adición de una función a la pintura del recipiente () evento.

Container.Paint += dropShadow;

dropShadow () tiene el siguiente aspecto:

    private void dropShadow(object sender, PaintEventArgs e)
    {
        Panel panel = (Panel)sender;
        Color[] shadow = new Color[3];
        shadow[0] = Color.FromArgb(181, 181, 181);
        shadow[1] = Color.FromArgb(195, 195, 195);
        shadow[2] = Color.FromArgb(211, 211, 211);
        Pen pen = new Pen(shadow[0]);
        using (pen)
        {
            foreach (Panel p in panel.Controls.OfType<Panel>())
            {
                Point pt = p.Location;
                pt.Y += p.Height;
                for (var sp = 0; sp < 3; sp++)
                {
                    pen.Color = shadow[sp];
                    e.Graphics.DrawLine(pen, pt.X, pt.Y, pt.X + p.Width - 1, pt.Y);
                    pt.Y++;
                }
            }
        }
    }

Es evidente que se puede recoger un tipo de control diferente de la colección del envase y puede variar el color y la profundidad de la sombra con algunos ajustes menores.

Otros consejos

Hay que sobrescribir el CreateParamsproperty como esto:

private const int CS_DROPSHADOW = 0x00020000;
protected override CreateParams CreateParams
{
    get
    {
        // add the drop shadow flag for automatically drawing
        // a drop shadow around the form
        CreateParams cp = base.CreateParams;
        cp.ClassStyle |= CS_DROPSHADOW;
        return cp;
    }
}

Hay en WPF si se puede estirar a usar ese lugar, no creo que hay una alternativa en las formas de Windows debido a las capacidades limitadas de GDI +.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top