Domanda

c'è un modo per aggiungere un'ombra esterna a controlli?

Ci sono dei controlli là fuori con questa caratteristica?

È stato utile?

Soluzione

Questa domanda è stato intorno per 6 anni e ha bisogno di una risposta. Spero che chi ha bisogno di fare questo può estrapolare una risposta per qualsiasi controllo da impostare la mia soluzione. Ho avuto un pannello e voluto disegnare un'ombra sotto ogni controllo figlio -. In questo caso uno o più pannelli (ma la soluzione deve valere per altri tipi di controllo con alcune modifiche al codice minori)

Come ombra per un controllo deve essere disegnato sulla superficie del contenitore che del controllo iniziamo aggiungendo una funzione per vernice del contenitore () evento.

Container.Paint += dropShadow;

dropShadow () si presenta così:

    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++;
                }
            }
        }
    }

Chiaramente si può scegliere un tipo di controllo diverso dalla collezione del contenitore e si può variare il colore e la profondità dell'ombra con alcune modifiche minori.

Altri suggerimenti

È necessario sovrascrivere il CreateParamsproperty in questo modo:

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;
    }
}

Non v'è in WPF se si può allungare a utilizzare che invece, non credo ci sia un'alternativa in Windows Form a causa delle capacità limitate di GDI +.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top