C# 如何在C.NET中在自定义形状的窗体上放置阴影?

C# 如何在C.NET中在自定义形状的窗体上放置阴影?,c#,.net,winforms,transparency,shadow,C#,.net,Winforms,Transparency,Shadow,我正在创建一个自定义形状的窗口窗体公共类窗口:窗体,需要放置适当的阴影。表单是带圆角的矩形,我正在定义一个合适的GraphicsPath来获得表单的形状 下面是应该执行此操作的部分代码: private const int CS_DROPSHADOW = 0x00020000; public Window() { FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; SetStyle(ControlStyles.Opaqu

我正在创建一个自定义形状的窗口窗体公共类窗口:窗体,需要放置适当的阴影。表单是带圆角的矩形,我正在定义一个合适的GraphicsPath来获得表单的形状

下面是应该执行此操作的部分代码:

private const int CS_DROPSHADOW = 0x00020000;

public Window()
{
 FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
 SetStyle(ControlStyles.Opaque | ControlStyles.OptimizedDoubleBuffer, true);
 TransparencyKey = Color.FromArgb(0xFF, 0, 0, 0);
}

protected override CreateParams CreateParams
{
 get
 {
  CreateParams cp = base.CreateParams;
  cp.ClassStyle |= CS_DROPSHADOW;
  return cp;
 }
}

protected override void OnPaint(PaintEventArgs e)
{
 e.Graphics.SmoothingMode = SmoothingMode.HighQuality;

 Pen ps = new Pen(Color.FromArgb(0xFF, 0, 0, 0));
 e.Graphics.FillRectangle(ps.Brush, this.ClientRectangle);

 Pen p1 = new Pen(Color.FromArgb(0xFA, 0xFA, 0xFA));
 Pen p2 = new Pen(Color.FromArgb(0xCD, 0xCD, 0xCD));
 GraphicsPath border =
     RoundedRectangle.Create(new Rectangle(0, 0, Width - 1, Height - 1), 7);
 e.Graphics.SetClip(border); // I'd prefer if this came after the following two
                             // lines, but doing that results in another problem
 e.Graphics.FillPath(p1.Brush, border);
 e.Graphics.DrawPath(p2, border);
 base.OnPaint(e);
 e.Graphics.ResetClip();
}
RoundedRectangle类来自

生成的阴影被投射,就好像形状是完美的矩形,在右下角可以看到。如何正确绘制阴影


编辑:我不敢相信,8年前的2004年,我在网上找到了关于这个问题的讨论,但仍然没有找到解决方案。

可能的重复不是重复。我问的是不规则形状形状上的阴影,另一个问题是创建不规则形状。但对于不规则形状,阴影的唯一选择是使其成为形状的一部分。使用带有阴影不透明度的图片作为不规则形状。Windows下拉阴影仅适用于本机Windows。长方形的。形状在半透明度方面似乎有问题,所以任何阴影都必然是实心的和丑陋的。除非有一个我不知道的解决办法,这就是为什么我在这里。