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ます。同じウィンドウクラスのウィンドウを作成しているので、それらはすべて同じクラススタイルを持っています。

あなたができることは、2つのクラスを登録することです。1つはドロップシャドウあり、もう1つはドロップシャドウなしです。クラス名が以前に登録されたクラスと異なる場合、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 が無視されることをオンラインで読みました。したがって、他のすべてが失敗した場合に問題を回避する1つの方法かもしれません.

于 2009-08-14T10:50:18.850 に答える