【发布时间】:2011-04-01 14:21:08
【问题描述】:
我制作了一个 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;
但它不起作用 - 不显示阴影(除非我还设置了 WS_THICKFRAME 集的可调整大小的边框,这看起来可怕)。这是一个弹出窗口,而不是子窗口,所以我不明白它为什么会失败。
请给点建议?
注意:这是一个与this 问题类似的问题,但仍未得到解答。
NB2:有一个名为 TShadowWindow 的不起眼的 VCL 组件,看起来它会做正确的事情,但事实证明它写得太粗略,不实用。
更新:在下面 Andreas 的 cmets 之后,我对此进行了进一步调查,并发现了一些细节。
在 Windows 7 下,我发现当弹出窗口 如果它位于同一应用程序的另一个窗口上方时,阴影不会出现。
这是一个简单的 Delphi 应用程序,它使用弹出窗口上的 CreateParams 来请求上述阴影。
看看投影在超出主窗口的地方是如何显示的?
但我想使用无边框窗口作为主窗口上方的弹出窗口。阴影将弹出窗口与下面的窗口区分开来。我上面所有的描述都是针对这种情况的。显然,这里有一些 Windows 机制的干扰。
我也在 Windows XP 下尝试过相同的应用程序。这是它的外观。
这适用于无处不在的阴影*。呸!
因此,正如 Andreas 所建议的那样,这似乎是 Vista/W7 的事情。
(*此文本和 screendump 的早期版本表明没有出现阴影。然而,事实证明这是因为我关闭了 Windows XP 显示选项“菜单下的阴影”。Duh。)
【问题讨论】:
-
我不完全明白你想要你的窗口。您确实不希望它像 RAD Studio IDE 中的 Code Insight 弹出窗口(具有可调整大小的粗边框)一样,是吗?
-
@Andreas:正确。我不想要一个可调整大小的边框 - 这是我可以通过设置问题中提到的 WS_THICKFRAME 得到的。我希望它的边框看起来像菜单的边框,即带有阴影的单条细线。实际上,现在您提到它,我注意到 Code Insight 显示至少三种不同类型的窗口,具体取决于上下文。我想成为那些没有可调整边框的人! :-)
标签: windows delphi windows-7 windows-xp delphi-2010