Borderless TForm mit Schlagschatten

Ich habe ein TForm-Derivat erstellt, das sich wie ein Dropdown-Teil einer Combo, eines Hinweisfensters oder eines Popup-Menüs verhält - eine temporäre Sache. Es hat keine Beschriftung - sein BorderStyle ist auf bsNone gesetzt. Das Formular wird nicht modal mit Show angezeigt, nachdem seine Position festgelegt wurde.

Um es hervorzuheben, benötigt es einen Schlagschatten um den Rand. Das Setzen des Rahmens auf bsNone hat jedoch zur Folge, dass der Schlagschatten verschwindet.

Verschiedene Google-Quellen schlagen Variationen davon vor:

procedure TdlgEditServiceTask.CreateParams(var Params: TCreateParams);
const
  CS_DROPSHADOW = $00020000;
begin
  inherited;
  { Enable drop shadow effect on Windows XP and later }
  if (Win32Platform = VER_PLATFORM_WIN32_NT) and
     ((Win32MajorVersion > 5) or
      ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))) then
    Params.WindowClass.Style := Params.WindowClass.Style or
             CS_DROPSHADOW;
end;

aber es funktioniert nicht - der Schatten wird nicht angezeigt (es sei denn, ich habe auch einen anpassbaren Rand mit WS_THICKFRAME gesetzt, der wie @ aussiehschrecklic). Dies ist ein Popup-Fenster, kein untergeordnetes Fenster. Ich verstehe nicht, warum dies fehlschlagen sollte.

Vorschläge bitte?

NB: Dies ist eine ähnliche Frage zuDie Frage, die unbeantwortet bleibt.

NB2: Es gibt eine obskure VCL-Komponente mit dem Namen TShadowWindow das sieht so aus, als würde es das Richtige tun, stellt sich aber als zu grob geschrieben heraus, um praktisch zu sein.

Aktualisieren Nach Andreas 'Kommentaren unten habe ich das weiter untersucht und ein paar nette Dinge herausgefunden.

nter Windows 7 habe ich festgestellt, dass der Schatten nicht angezeigt wird, wenn das Popup-Fensterwenn es sich über einem anderen Fenster derselben Anwendung befindet.

Hier ist eine einfache Delphi-App, die CreateParams in einem Popup-Fenster verwendet, um einen Schatten anzufordern, wie oben beschrieben.

Sehen Sie, wie der Schlagschatten dort erscheint, wo er über das Hauptfenster hinausragt?

Aber ich möchte das randlose Fenster als Popup über dem Hauptfenster verwenden. Der Schlagschatten unterscheidet das Popup vom Fenster darunter. Alle meine obigen Beschreibungen beziehen sich auf diesen Umstand. Offensichtlich stört hier ein Windows-Mechanismus.

Ich habe die gleiche Anwendung auch unter Windows XP ausprobiert. So sieht es aus.

Dies funktioniert mit Schatten überall korrekt *. Gah!

So scheint es eine Vista / W7 Sache zu sein, wie Andreas vorschlägt.

(* Eine frühere Version dieses Texts und Screendumps deutete darauf hin, dass kein Schatten angezeigt wurde. Dies stellte sich jedoch heraus, weil die Windows XP-Anzeigeoption "Schatten unter Menüs" deaktiviert war. Duh.)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage