同一表单类的不同实例如何使用不同的窗口类样式?

时间:2009-08-14 10:31:07

标签: windows delphi winapi vcl

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

2 个答案:

答案 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。如果所有其他方法都失败,那么这可能是解决问题的一种方法。