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;
}
}
6条答案
按热度按时间aij0ehis1#
你必须像这样覆盖
CreateParams
属性:nnsrf1az2#
这个问题已经存在了6年,需要一个答案。我希望任何需要这样做的人都可以从我的解决方案中推断出任何控件集的答案。我有一个面板,想在每个子控件下面画一个阴影-在这个例子中是一个或多个面板(但是这个解决方案应该对其他控件类型有一些小的代码修改)。
由于一个控件的投影必须绘制在该控件容器的表面上,我们首先向容器的Paint()事件添加一个函数。
dropShadow()看起来像这样:
显然,你可以从容器的集合中选择不同的控件类型,你可以通过一些小的调整来改变阴影的颜色和深度。
fkaflof63#
最高的答案实际上会产生一个阴影,但我个人对它并不满意,原因有几个:
所以,因为所有这些事情,我最终为我的项目写了我自己的,我想我会在这里分享:
在这个实现中,所有添加到
shadowControls
的控件都将使用平滑的阴影绘制。您应该能够对非矩形形状实现此功能,因为生成阴影的主函数需要GraphicsPath
。请注意,在将阴影绘制到窗体之前,将阴影绘制到另一个位图是很重要的,因为main函数需要SourceCopy
的合成模式才能工作,这意味着如果您不首先将其绘制到另一个表面,则阴影后面的任何内容都将被完全替换,并且透明度方面是无用的。我正在回答10岁的问题,但希望这能帮助到别人!zhte4eai4#
如果你可以扩展到使用WPF,我不相信在Windows窗体中有替代方案,因为GDI+的能力有限。
snz8szmq5#
一种方法是将控件放置在具有以下属性的表布局中:
这将给予调整外部列和行大小的灵活性。下面是一个快速草图,可以直观地看到设计器中的表布局:
Table Layout Sketch
Table Layout Sketch 2
应用程序中最终结果的实际屏幕截图:
Screenshot
b0zn9rqh6#
这里有一个有争议的观点,你不用代码就可以做到。将主面板的边框样式设置为固定单边框。在它下面创建3个面板,每个面板在每个方向上都大1个像素。3个面板中的每一个都是浅灰色。不完美,但便宜和容易。
panel with pseudo-shadow