我尝试使用以下技术来启用/禁用窗口的阴影效果:( CreateParams当然是覆盖的.TToolWindow来自TForm)。
procedure TToolWindow.CreateParams(var Params: TCreateParams);
var
LShadow: boolean;
begin
inherited;
if (Win32Platform = VER_PLATFORM_WIN32_NT)
and ((Win32MajorVersion > 5)
or ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))) then //Win XP or higher
if SystemParametersInfo(SPI_GETDROPSHADOW, 0, @LShadow, 0) then
begin
if LShadow and HasShadow then
Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;
end;
虽然这适用于TToolWindow类的第一个实例,但以下实例保留第一个实例的设置,而不管HasShadow的值(它是TToolWindow类的已发布属性)。
如何在TToolWindow的不同实例上设置不同的阴影设置?
TIA
答案 0 :(得分:2)
每次创建给定类的第一个实例时,VCL就会动态注册表单类的必要窗口类。这就解释了为什么TToolWindow
的所有辅助实例都与第一个实例具有相同的阴影,无论HasShadow
值如何。您正在创建相同窗口类的窗口,因此它们都具有相同的类样式。
你可以做的是注册两个类,一个带有阴影,另一个没有它。如果类名与先前注册的类不同,VCL将注册一个新的窗口类。
这样的事情:
procedure TToolWindow.CreateParams(var Params: TCreateParams);
var
LShadow: boolean;
begin
inherited;
if (Win32Platform = VER_PLATFORM_WIN32_NT)
and ((Win32MajorVersion > 5)
or ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1)))
then begin
//Win XP or higher
if SystemParametersInfo(SPI_GETDROPSHADOW, 0, @LShadow, 0)
and LShadow and HasShadow
then begin
Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
StrLCopy(Params.WinClassName, 'TDelphiToolWindowWithShadow', 63);
end else begin
Params.WindowClass.Style := Params.WindowClass.Style and not CS_DROPSHADOW;
StrLCopy(Params.WinClassName, 'TDelphiToolWindowNoShadow', 63);
end;
end;
end;
答案 1 :(得分:0)
只是猜测......你的TToolWindow的后续实例是孩子们吗?也许他们是继承父母的风格。
编辑:实际上,我在网上看到,如果你给项目一个WS_CHILD样式,它将忽略CS_DROPSHADOW。如果所有其他方法都失败,那么这可能是解决问题的一种方法。