Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   GlassFrame: Unerwünschtes Blending, ich will opak (https://www.delphipraxis.net/164807-glassframe-unerwuenschtes-blending-ich-will-opak.html)

Medium 30. Nov 2011 14:21


GlassFrame: Unerwünschtes Blending, ich will opak
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tach zam!

Nachdem ich nach elendigem Suchen endlich heraus gefunden habe, warum mein D2007 unter Win7 kein Glassframe anzeigen wollte (in der DwmApi.pas wurde nach MajorWinVersion >= 6 geprüft, >= 5 war wohl treffender, denn das ist der Wert den mein Win7 dort hinterlässt :?), verzweifel ich ein wenig am Verhalten der Glass-Areas.

Nachvollziehbar ist noch, dass lediglich TWinControl Nachfahren vernünftig in einem Glass Bereich gezeichnet werden. (Siehe Edit) Alles, was den Formular-Canvas mit benutzt, führt zum additiven Mischen mit dem, was grad durch's Formular schimmert. Damit kann ich (mehr oder minder) noch leben. Problematisch ist aber, dass wenn ich z.B. ein Panel (um einen undurchsichtigen Bereich auf dem Glas zu machen) nehme, dass zwar der Panelhintergrund brav opak ist, aber alle weiteren nicht-WinControls - trotz dieses Panels als Parent - wieder das additive Verhalten zeigen.
Dadurch wird z.B. ein TLabel mit schwarzem Text auf dem Panel komplett durchsichtig, und schneidet quasi ein Loch in Textform in das Panel. Noch schlimmer ist dies bei den ganz normalen TButtons: Auch dort wird zwar der Button an sich zwar richtig gezeichnet, jedoch der Text darauf ist wieder durchsichtig. Um es perfekt zu machen: Lege ich einen TButton auf das TPanel, wird auf ein Mal der ganze Button additiv und nicht opak gezeichnet, ganz wie non-WinControls direkt auf dem Formular im Glass Bereich. Wah!

Gibt es irgend einen Kniff, "vernünftig" Dinge in die Glass-Area zu zeichnen, ohne dass ich dafür weitere Fremdkompos oder Libs einsetzen muss (meine Co-Devs steinigen mich sonst bald), und fix geht? Da es letztlich nicht Lebensnotwendig ist, muss ich sonst darauf verzichten. Aber hübsch wäre es! :)

Dankschö schon mal!

\\Edit: Oh, ein normales TPanel wird auch additiv gezeichnet, es war nur das TAdvSmoothPanel (TMS) so nett. Bildchen angefügt! (Beide Panels sind clRed. Nett aber, dass das SmoothPanel den Verlauf nach Transparent schafft!)

ChrisE 30. Nov 2011 15:34

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Zitat:

Zitat von Medium (Beitrag 1138623)
Tach zam!
....in der DwmApi.pas wurde nach MajorWinVersion >= 6 geprüft, >= 5 war wohl treffender, denn das ist der Wert den mein Win7 dort hinterlässt :?...

:gruebel: also
  • Vista -> Major 6 / Minor 0
  • Win7 -> Major 6 / Minor 1

Wäre der Test nicht richtig?

Gruß, Chris

Medium 30. Nov 2011 15:40

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Ich hab den Inhalt der Variablen nachgeprüft. Es steht eine 5 drin. Warum auch immer :)
Ich habe mir die DwmApi.pas einfach angepasst und ins Projektverzeichnis geschmissen, um das Original nicht zu stören. An sich geht's ja damit auch, nur dass o.g. "Fehlverhalten" einen Nutzen schwer in Frage stellt bisher :?

ChrisE 30. Nov 2011 15:43

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Zitat:

Zitat von Medium (Beitrag 1138645)
....Es steht eine 5 drin. Warum auch immer :)...

Vielleicht geht es an der Sache vorbei, aber ich würde erstmal eine andere Maschine mit Win7 testen. WinMajor muss 6 sein und Minor 1. Es könnte natürlich sein, dass dir irgendwein Kompatibilitätsmodus dazwischen funkt (daher major /minor falsch) und der/das dann für das Verhalten verantwortlich ist.

Gruß, Chris

Uwe Raabe 30. Nov 2011 15:46

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Zitat:

Zitat von Medium (Beitrag 1138645)
Ich hab den Inhalt der Variablen nachgeprüft. Es steht eine 5 drin. Warum auch immer :)

Sieht so aus, als würde Win 7 dir ein XP vorgaukeln. Hängt vielleicht mit der Delphi-Version zusammen. Mit den aktuellen Versionen kann ich das hier nicht nachvollziehen.

Namenloser 30. Nov 2011 17:09

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Afaik muss man Doublebuffering aktivieren. Das ganze kommt halt daher, dass die GDI, die von der VCL genutzt wird, keinen Alpha-Channel unterstützt, der DWM aber einen braucht... und ich glaube, es wird Premultiplied-Alpha verwendet, sodass additives Blending herauskommt, wenn der Alphachannel 0 ist – das ist, was man dort sieht.

Medium 30. Nov 2011 17:48

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Doublebuffered ändert leider nichts an dem Verhalten. Schaut alles genau so aus wie ohne :(

Ich habe die IDE in einer VM (aktueller VMWare Player) laufen, aber nicht im Kompatibilitätsmodus. (Zumindest habe ich das nicht aktiv eingestellt.) Ich schau mal morgen, was die Echse auf dem Host (auch Win7) so sagt, aber an sich sollte Windows seine Versionsangaben kaum abhängig von der Hardware machen, egal wie virtuell sie ist. Dies war zudem die einzige Stelle, an der auf die Version geprüft wurde - vorm Absetzen der API Funktion, die das Glass-Frame setzt. Und an sich geht es ja! Andere Programme mit Glass-Teilen in der VM sehen völlig normal aus, aber einen Versuch ist's wert.

Namenloser 30. Nov 2011 17:50

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Hast du Doublebuffering nur für das Formular oder für jedes einzelne Control aktiviert?

Medium 30. Nov 2011 18:03

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Für das Formular. So hatte ich das zumindest auch bei meinen Recherchen aufgeschnappt. Wobei auch irgendwo stand, dass es ohne gar nicht ginge, was es bei mir aber tut :cyclops:

Medium 1. Dez 2011 08:41

AW: GlassFrame: Unerwünschtes Blending, ich will opak
 
Auf dem Host bekomme ich dann tatsächlich eine 6 in Win32MajorVersion, leider aber auch genau das selbe Fehlverhalten wie eingangs beschrieben. Ich glaub, ich muss das Glass-Getöse wohl als "nicht nutzbaren Fun-Hack in/von Windows/Delphi" abtun, weil für funktionale Elemente scheint das ja einfach unbrauchbar zu sein :? (Nicht zuletzt auch dank SheetOfGlass in Verbindung mit bsNone. Gibts nen Thread mit Lösung hier, aber ich bräuchte es out of the box, um diese Spielerei mit "kein Mehraufwand, auch in der Wartung" rechtfertigen zu können.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:54 Uhr.
Seite 1 von 2  1 2      

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