Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   GdiPlus DropShadow für Hauptform (https://www.delphipraxis.net/170545-gdiplus-dropshadow-fuer-hauptform.html)

stOrM 22. Sep 2012 11:13

GdiPlus DropShadow für Hauptform
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich überlege gerade wie man am besten einen DropShadow inkl. Transparenzen um eine Form legen könnte die keinen Border hat also (BorderStyle = BsNone)

Gut ich könnte:

Delphi-Quellcode:
procedure TTest.CreateParams(var Params: TCreateParams);
const
  CS_DROPSHADOW = $00020000;
begin
  inherited;
  Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;
benutzen, dass Problem hierbei ist, dass zum einen der Schatten so dermaßen klein ist das man Ihn auch direkt weglassen kann. Es sei denn man kann die Schattengröße selber bestimmen.

Zum anderen ist das Problem, was wenn das Fenster sagen wir mal Rund waere? Regionen fallen flach soweit ich weiß, da keine Transparenz, abgesehen davon dürfte der Aufwand erheblich sein. Die Verwendng von PNG's find ich persönlich ebenfalls besser, da extrem schnell erstellbar im Vergleich zu Masken usw.

Jetzt war folgende Überlegung von der ich nicht gerade begeistert bin, aber es würde glaube ich funkionieren:

Man hat eine Hauptform und 8 weitere Formen welche man um die Hauptform herum plaziert. Die 8 Formen werden dazu genutzt, den Schlagschatten zu zeichen. Gut man müßte noch dafür sorgen das diese jedesmal mitwandern sofern die Hauptform verschoben wird.

Das ganze könnte man mit vielleicht GdiPlus / UpdateLayeredWindow machen. Meine Frage waere jetzt:

Weiß jemand eine bessere Möglichkeit und wenn ich das so machen würde, wie werden die 4 Teile (Top, Left, Bottom und Right sauber gestrecthed mittels GdiPlus wobei natürlich die Transparenz erhalten bleiben müssen, die 4 Eckpunkte muss ich ja nicht stretchen...)

Ich hab mal ein Bild angehangen damit man mir folgen kann, ich denke das erklaert wie der Schatten aufgebaut waere bzw. markieren die roten Linien die Schnittkanten des Schattens also die 8 Teile.

EWeiss 22. Sep 2012 16:46

AW: GdiPlus DropShadow für Hauptform
 
So wie ich deiner letzten Kritik an einen meiner Projekte entnehmen konnt ;)
scheinst du ja ein Designer Profi zu sein.
Dürfte also kein problem sein mit APS oder anderen Malprogramm die rechte und untere
seite der Form so zu zeichnen das die Form eínen Schatten emuliert
abhängig vom Activated status.

Wobei ein Schatten rings um die Form nicht wirklich ein DropShadow ist.

gruss

stOrM 22. Sep 2012 18:01

AW: GdiPlus DropShadow für Hauptform
 
Zitat:

Zitat von EWeiss (Beitrag 1183984)
So wie ich deiner letzten Kritik an einen meiner Projekte entnehmen konnt ;)
scheinst du ja ein Designer Profi zu sein.
Dürfte also kein problem sein mit APS oder anderen Malprogramm die rechte und untere
seite der Form so zu zeichnen das die Form eínen Schatten emuliert
abhängig vom Activated status.

Wobei ein Schatten rings um die Form nicht wirklich ein DropShadow ist.

gruss

Gehst du so mit Kritik um?
Wo oder wer hat jemals davon gesprochen das ich ein Designprofi waere? Würde ich mir selber nie anmaßen von mir zu behaupten, hab ich auch nie.
Was dein Projekt anging war es nicht wirklich als Kritik eher als Anregung gemeint aber nun gut, ist offtopic...

Ja und du hast Recht ist kein Schlagschatten...

EWeiss 23. Sep 2012 04:05

AW: GdiPlus DropShadow für Hauptform
 
War kein angriff gegen deine person.. dachte nur das du das kannst nachdem du dein Statement abgegeben hattest.
Ich würde es auch mit Adobe machen allerdings geht es auch direkt mit GDI+

Hier mal ein Link

Müßtest du halt nur auf die Form anwenden.

gruss

stOrM 23. Sep 2012 11:15

AW: GdiPlus DropShadow für Hauptform
 
Zitat:

Zitat von EWeiss (Beitrag 1184017)
War kein angriff gegen deine person.. dachte nur das du das kannst nachdem du dein Statement abgegeben hattest.
Ich würde es auch mit Adobe machen allerdings geht es auch direkt mit GDI+

Hier mal ein Link

Müßtest du halt nur auf die Form anwenden.

gruss

Schwamm drüber, vielleicht hatte ich auch zu wenig Kaffee gestern :-D
Erstmal danke für den Link.

Mit dem können hast du ja auch Recht, das Problem liegt ja auch nicht im Erstellen des Schattens in einem Grafikprogramm sonder eher darin:

Ich brauch ja (Ich nenne es mal eine Geisterform und wieso ich auf 8 Formen gekommen bin weiß ich grad auch nicht, eine sollte wohl reichen.)

Diese Form ist halt unsichtbar und liegt unter der Hauptform. Wenn nun aber die Hauptform vergrößert wird: Muss der Schatten ja gestreckt werden und zwar die 4 Teile (Oben, Unten, Rechts und Links, die Eckbereiche werden ja nicht gestreckt) ich hab es noch nicht probiert aber ich bin einfach davon ausgegangen das beim Vergrößern der Schatten seine Transparenz verliert.

Gut ggf. geht es auch komplett ohne Png's mit deinem Link müsste ich mal sehen.

Gruß
Marc

Bummi 27. Sep 2012 15:19

AW: GdiPlus DropShadow für Hauptform
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ich hab mich mal dran versucht ....

stOrM 27. Sep 2012 15:38

AW: GdiPlus DropShadow für Hauptform
 
Zitat:

Zitat von Bummi (Beitrag 1184715)
Ich hab mich mal dran versucht ....

Öhm und das sieht ziemlich heiss aus dein Versuch :thumb:

Bummi 27. Sep 2012 15:42

AW: GdiPlus DropShadow für Hauptform
 
Danke, wenn's Dir taugt kannst Du es ja weiter anfummeln ...

stOrM 27. Sep 2012 15:46

AW: GdiPlus DropShadow für Hauptform
 
Zitat:

Zitat von Bummi (Beitrag 1184723)
Danke, wenn's Dir taugt kannst Du es ja weiter anfummeln ...

Ich würd mal sagen mehr wie taugt, dass ist so ziemlich die optimal Lösung für mich zumindest...

Vielen Dank:)

Bummi 28. Sep 2012 12:29

AW: GdiPlus DropShadow für Hauptform
 
Eine kleine Performanceoptimierung fehlt noch in der Prozedur Prep

Delphi-Quellcode:
if (width=Fbackimage.Width) and (Height=Fbackimage.Height )then Exit;

Namenloser 29. Sep 2012 22:59

AW: GdiPlus DropShadow für Hauptform
 
Liste der Anhänge anzeigen (Anzahl: 2)
Der „Schatten“ von Bummi sieht allerdings etwas seltsam aus, weil er linear an Intensität abnimmt. Normalerweise simuliert man Schatten mit einem Gaußschen Weichzeichner, was dem natürlichen Schatten eher entspricht.

Ich habe da über die letzten zwei Tage (war krank, deshalb hat es etwas länger gedauert...) mal selber was gebastelt, was kein GDI+ braucht und realistischere Schatten produziert. Dabei habe ich auch sehr darauf geachtet, dass Schatten und Fenster immer so gut wie synchron sind (also dass nicht der Schatten mit Verzögerung hinterherhinkt wenn man das Fenster bewegt). Das ganze ist über einen Hook gelöst, das heißt, man braucht sich um die Aktualisierung der Position gar nicht mehr manuell zu kümmern.

Es genügt im einfachsten Falle, die Unit unShadow einzubinden und folgenden Code ins OnCreate-Ereignis eines Formulars schreiben:
Delphi-Quellcode:
TShadowForm.Create(Self).Attach(Handle);
Man kann aber, wenn man will, auch verschiedene Parameter von TShadowForm verändern, z.B. die Farbe (Achtung: ARGB-Format!) oder den Weichzeichnungs-Radius. Im Anhang seht ihr ein Bild von einem blauen Schatten (damit man besser den Unterschied erkennt zu dem schmalen schwarzen Schatten, den Windows sowieso immer zeichnet, was ich unter Vista nicht abstellen kann).

Die unShadow-Unit kann nur Schatten von Rechtecken darstellen, allerdings sind in der unGaussBlur auch Funktionen enthalten, um beliebige Formen weichzuzeichnen. Das wird in der Demo-Anwendung ebenfalls demonstriert. Allerdings ist meine Implementierung des Gaußschen Weichzeichners leider nicht besonders schnell bei großen Radien...

Bummi 29. Sep 2012 23:12

AW: GdiPlus DropShadow für Hauptform
 
@NamenLozer

tja, das Bessere ist der Feind des brauchbaren ...:thumb:

stOrM 1. Okt 2012 13:51

AW: GdiPlus DropShadow für Hauptform
 
Respekt! Ich find beide Lösungen genial! :thumb:

Also das der gaußische Weichzeichner zu langsam waere kann ich bisher nicht feststellen sieht wirklich super aus. Ich denke für einen normalen Fensterschatten nutzt man in der Regel ja eh nicht enorme Radien...

Aber mal eine Frage, sollte man wie im Eingansthread erwaehnt statt der gaußischen Weichzeichnung nun 8 Png's nutzen (Ok, man ist dann auf die Form der Form festgelegt) dann sollte die Geschwindigkeit eigentlich ja kein Problem sein???

Müßte man sich nur Gedanken darüber machen wie man die speziellen Teile streckt oder staucht bei Größenaenderung der Form?

Namenloser 1. Okt 2012 13:57

AW: GdiPlus DropShadow für Hauptform
 
Für Rechtecke habe ich ja auch eine Extra-Funktion gebastelt, die nicht das ganze Bitmap blurrt, sondern die Farbverläufe einfach direkt zeichnet. Diese ist recht schnell. Du kannst natürlich auch vorberechnete PNGs verwenden, aber einen wirklichen Performancevorteil würde ich davon nicht erwarten.

Nur weil du im Eingangspost geschrieben hattest „Was wenn das Formular z.B. rund wäre?“, hatte ich zunächst einen „richtigen“ Gaußschen Weichzeichner implementiert. Der ist ja auch in der Demo mit drin, kannst du in Aktion sehen, wenn du die oberste Trackbar veränderst. Da siehst du schon, dass sich das Bild bei größeren Radien mit einiger Verzögerung aktualisiert... der Ansatz war für Schatten also nur bedingt geeignet, vor allem wenn die Größe der Form veränderlich ist.

stOrM 1. Okt 2012 14:02

AW: GdiPlus DropShadow für Hauptform
 
Zitat:

Zitat von NamenLozer (Beitrag 1185261)
Für Rechtecke habe ich ja auch eine Extra-Funktion gebastelt, die nicht das ganze Bitmap blurrt, sondern die Farbverläufe einfach direkt zeichnet. Diese ist recht schnell. Du kannst natürlich auch vorberechnete PNGs verwenden, aber einen wirklichen Performancevorteil würde ich davon nicht erwarten.

Nur weil du im Eingangspost geschrieben hattest „Was wenn das Formular z.B. rund wäre?“, hatte ich zunächst einen „richtigen“ Gaußschen Weichzeichner implementiert. Der ist ja auch in der Demo mit drin, kannst du in Aktion sehen, wenn du die oberste Trackbar veränderst. Da siehst du schon, dass sich das Bild bei größeren Radien mit einiger Verzögerung aktualisiert... der Ansatz war für Schatten also nur bedingt geeignet, vor allem wenn die Größe der Form veränderlich ist.

Womit man aber ohne weiteres Leben kann denke ich, ansonsten ist das wohl die perfekteste Lösung alleine schon in Anbetracht, wenn man andere Lösungen sieht, wo da mit einem haufen Forms oder halt einer Menge an Bilder herumgebaut wird.

EWeiss 1. Okt 2012 18:52

AW: GdiPlus DropShadow für Hauptform
 
Die richtige vorgehensweise ist meines erachtens.
Die Form egal wie sie aussieht zu einer maske (Schwarz) konvertieren.
Darauf wendet man dann Gaussianblur an.
Über diese maske wird dann die Form gelegt wobei die Maske der Form dann natürlich noch folgen muss bei größenänderung.

Das könnte man dann einfach mit StretchBlt erledigen.

Grundsätzlich ist aber die verwendung von GaussianBlur richtig.

Aber jeder wie er will ;)

gruss

dunningkruger 1. Okt 2012 19:52

AW: GdiPlus DropShadow für Hauptform
 
Zitat:

Zitat von eweiss (Beitrag 1185308)
grundsätzlich ist aber die verwendung von gaussianblur richtig.

Aber jeder wie er will ;)

Danke für den Segen ;)

fs999 11. Dez 2013 14:42

AW: GdiPlus DropShadow für Hauptform
 
Hallo,

Entschuldige wenn ich dieses Thema heraus grabe, aber ich möchte wissen ob es möglich ist diese schöne gaussblur form auch unter TPanels verwenden kann, oder so verändern damit es damit funktioniert.

Vielen Dank
Grüsse


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz