Drop Shadow nos controles WinForms?
-
20-09-2019 - |
Pergunta
Existe uma maneira de adicionar uma sombra de gota aos controles?
Existem controles por aí com esse recurso?
Solução
Esta pergunta existe há 6 anos e precisa de uma resposta. Espero que quem precise fazer isso possa extrapolar uma resposta para qualquer conjunto de controle da minha solução. Eu tinha um painel e queria desenhar uma sombra de gota por baixo de todos os controles filhos - nesse caso, um ou mais painéis (mas a solução deve ser boa para outros tipos de controle com algumas pequenas alterações de código).
Como a sombra de queda para um controle deve ser desenhada na superfície do recipiente desse controle, começamos adicionando uma função ao evento Paint () do contêiner.
Container.Paint += dropShadow;
DropShadow () se parece com o seguinte:
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++;
}
}
}
}
Claramente, você pode escolher um tipo de controle diferente da coleção do contêiner e pode variar a cor e a profundidade da sombra com alguns pequenos ajustes.
Outras dicas
Você tem que substituir o CreateParams
propriedade como esta:
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;
}
}
Existe no WPF se você pode se estender a usar isso, não acredito que haja uma alternativa nos formulários do Windows devido às capacidades limitadas do GDI+.