2009-08-14 26 views
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クラスの最初のインスタンスのために[OK]を動作しますが、次の場合は関係なく、(TToolWindowクラスの公開されたプロパティです)HasShadowの値の、最初のインスタンスから設定を保持します。

TToolWindowの異なるインスタンスで異なるシャドウ設定を使用するにはどうすればよいですか?

TIA

答えて

2

VCLは、特定のクラスの最初のインスタンスが作成されるたびに、フォームクラスに必要なウィンドウクラスをオンザフライで登録します。これは、TToolWindowのすべてのセカンダリインスタンスが、HasShadowの値にかかわらず、最初のインスタンスと同じシャドウを持つ理由を説明しています。同じウィンドウクラスのウィンドウを作成しているので、すべて同じクラススタイルです。

あなたができることは、ドロップシャドウとそれ以外の2つのクラスを登録することです。クラス名が以前に登録されたクラスと異なる場合、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; 
0

だけの推測では...あなたのTToolWindowの後続のインスタンスの子でありますか?おそらく彼らは親からスタイルを継承しているでしょう。

編集:実際には、アイテムをWS_CHILDスタイルにすると、CS_DROPSHADOWは無視されます。だから、それが他のすべてが失敗した場合、あなたの問題をハックするための1つの方法かもしれません。

関連する問題