1

我尝试使用以下技术来启用/禁用窗口的阴影效果:(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

4

2 回答 2

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;
于 2009-08-14T19:11:08.517 回答
0

只是猜测......您的 TToolWindow 的后续实例是子级吗?也许他们正在从父母那里继承风格。

编辑:实际上,我在网上看到如果你给项目一个 WS_CHILD 样式,它将忽略 CS_DROPSHADOW。因此,如果一切都失败了,这可能是解决您的问题的一种方法。

于 2009-08-14T10:50:18.850 回答