Отбросить тень в элементах управления Winforms?
-
20-09-2019 - |
Вопрос
Есть ли способ добавить тень к элементам управления?
есть ли какие-либо элементы управления этой функцией?
Решение
Этот вопрос существует уже 6 лет и требует ответа.Я надеюсь, что любой, кому понадобится это сделать, сможет экстраполировать ответ для любого набора элементов управления из моего решения.У меня была панель, и я хотел нарисовать тень под каждым дочерним элементом управления — в данном случае одну или несколько панелей (но решение должно подойти и для других типов элементов управления с некоторыми незначительными изменениями кода).
Поскольку тень для элемента управления должна быть нарисована на поверхности контейнера этого элемента управления, мы начинаем с добавления функции к событию Paint() контейнера.
Container.Paint += dropShadow;
dropShadow() выглядит следующим образом:
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++;
}
}
}
}
Очевидно, что вы можете выбрать другой тип элемента управления из коллекции контейнера, а также изменить цвет и глубину тени с некоторыми небольшими изменениями.
Другие советы
Вам придется перезаписать CreateParams
такое свойство:
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;
}
}
В WPF есть, если вы можете использовать его вместо этого, я не верю, что в Windows Forms есть альтернатива из-за ограниченных возможностей GDI+.