2009-08-14 4 views
1

J'essaie d'utiliser la technique suivante pour activer/désactiver l'effet d'ombre pour une fenêtre: (Le CreateParams est bien sûr surchargé, le TToolWindow descend de TForm).Comment différentes instances de la même classe de formulaire peuvent-elles utiliser différents styles de classes de fenêtres?

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; 

Bien que cela fonctionne bien pour la première instance de la classe TToolWindow, les cas suivants gardent le réglage de la première instance, quelle que soit la valeur de HasShadow (qui est une propriété publiée de la classe TToolWindow).

Comment puis-je avoir différents paramètres d'ombre sur différentes instances de TToolWindow?

TIA

Répondre

2

La VCL enregistre les classes de fenêtres nécessaires pour les classes de formulaire à la volée, une fois chaque fois que la première instance d'une classe donnée est créée. Cela explique pourquoi toutes les instances secondaires de votre TToolWindow ont la même ombre que la première instance, quelle que soit la valeur HasShadow. Vous créez des fenêtres de la même classe de fenêtre, elles ont donc toutes le même style de classe.

Ce que vous pourriez faire est d'enregistrer deux classes, l'une avec l'ombre portée, l'autre sans elle. La VCL enregistrera une nouvelle classe de fenêtre si le nom de classe est différent de la classe précédemment enregistrée.

Quelque chose comme ceci:

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

Juste une supposition ... sont les cas suivants les enfants de votre TToolWindow? Peut-être qu'ils héritent du style du parent. Edit: En fait, j'ai lu en ligne que si vous donnez un style WS_CHILD aux éléments, il ignorera CS_DROPSHADOW. Donc, cela pourrait être une façon de contourner votre problème si tout le reste échoue.

Questions connexes