我制作了一个类似于组合的下拉部分,或提示窗口或弹出菜单的TForm衍生物 - 一个临时的东西.它没有标题 - 它的BorderStyle设置为bsNone.使用Show设置其位置,以非模态方式显示表单.
为了突出它,它的边界需要一个阴影.但是,将其边框设置为bsNone的结果是投影阴影消失.
各种Google消息来源都提出了以下变体:
procedure TdlgEditServiceTask.CreateParams(var Params: TCreateParams);
const
CS_DROPSHADOW = $00020000;
begin
inherited;
{ Enable drop shadow effect on Windows XP and later }
if (Win32Platform = VER_PLATFORM_WIN32_NT) and
((Win32MajorVersion > 5) or
((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))) then
Params.WindowClass.Style := Params.WindowClass.Style or
CS_DROPSHADOW;
end;
Run Code Online (Sandbox Code Playgroud)
但它不起作用 - 不显示阴影(除非我还设置了一个可调整大小的边框,设置了WS_THICKFRAME,看起来很糟糕).这是一个弹出窗口,而不是子窗口,所以我不明白它为什么会失败.
建议好吗?
注意:对于这个问题,这是一个类似的问题,仍然没有答案.
NB2:有一个名为TShadowWindow的模糊VCL组件,看起来它会做正确的事情,但事实证明它写得太粗糙了.
更新:根据安德烈斯在下面的评论,我进一步调查了这一点,并发现了一些细节.
在Windows 7下,我发现当弹出窗口位于同一应用程序的另一个窗口时,阴影不会出现.
这是一个简单的Delphi应用程序,它在弹出窗口中使用CreateParams来请求阴影,如上所述.

看看阴影如何出现在主窗口之外的位置?
但是我想在主窗口上使用无边框窗口作为弹出窗口.投影将弹出窗口与下面的窗口区分开来.我上面的所有描述都指的是这种情况.显然有些Windows机制在这里干扰.
我也在Windows XP下尝试过相同的应用程序.这是它的外观.

这适用于任何地方的阴影*.尔加!
所以它似乎是Vista/W7的东西,正如安德烈亚斯所暗示的那样.
(*此文本的早期版本和screendump表示没有出现阴影.但是,原来是因为我关闭了Windows XP显示选项'菜单下的阴影'.杜.)