コントロールにドロップシャドウを追加する方法はありますか?
この機能を備えたコントロールはありますか?
この質問は6年前からあり、回答が必要です。これを行う必要がある人は誰でも、私のソリューションから任意のコントロールセットの答えを推定できることを願っています。私はパネルを持っていて、すべての子コントロールの下にドロップシャドウを描きたいと思っていました-この例では1つ以上のパネルです(ただし、このソリューションは、コードを少し変更するだけで、他のコントロールタイプにも適しています)。
コントロールのドロップシャドウはそのコントロールのコンテナの表面に描画する必要があるため、まずコンテナの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
propertyを上書きする必要があります。
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にありますが、GDI +の機能が制限されているため、Windowsフォームに代替手段があるとは思いません。