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/)
-   -   Transparente Bereiche werden nicht aktualisiert (https://www.delphipraxis.net/201324-transparente-bereiche-werden-nicht-aktualisiert.html)

skoschke 12. Jul 2019 10:25

Transparente Bereiche werden nicht aktualisiert
 
Hallo,

ich habe ein transparentes Panel, welches weitere Controls enthält.
Der Hintergrund wird auch schön durchgezeichnet, bis auf einen kleinen Fehler:

Sobald das Panel per Code verschoben wird, wandert der transparente Bereich mit, als wenn er ausgeschnitten worden wäre!
Ein Panel.Refresh oder Repaint bringt gar nichts, ich behelfe mir momentan damit, das Panel vor dem Schieben unsichtbar zu machen und danach wieder visible zu setzen, dann ist der durchscheinende Hintergrund wieder korrekt.

Nur gefällt mir das nicht, es muss doch eine Möglichkeit geben, diesen Hintergrund zu "repainten"?

Ciao
Stefan

EWeiss 12. Jul 2019 10:41

AW: Transparente Bereiche werden nicht aktualisiert
 
Zitat:

es muss doch eine Möglichkeit geben, diesen Hintergrund zu "repainten"?
Dann musst du WM_PAINT überschreiben und den Hintergrund in dem Event auf das Panel neu zeichnen..
Zitat:

Ein Panel.Refresh oder Repaint bringt gar nichts
Wie denn auch es ist nur ein Invalidate es zeichnet aber nicht automatisch den Hintergrund deines Panels in das Panel.
Das must du selber tun.

gruss

peterbelow 12. Jul 2019 12:53

AW: Transparente Bereiche werden nicht aktualisiert
 
Zitat:

Zitat von skoschke (Beitrag 1436562)
Hallo,

ich habe ein transparentes Panel, welches weitere Controls enthält.
Der Hintergrund wird auch schön durchgezeichnet, bis auf einen kleinen Fehler:

Sobald das Panel per Code verschoben wird, wandert der transparente Bereich mit, als wenn er ausgeschnitten worden wäre!
Ein Panel.Refresh oder Repaint bringt gar nichts, ich behelfe mir momentan damit, das Panel vor dem Schieben unsichtbar zu machen und danach wieder visible zu setzen, dann ist der durchscheinende Hintergrund wieder korrekt.

Nur gefällt mir das nicht, es muss doch eine Möglichkeit geben, diesen Hintergrund zu "repainten"?

Ciao
Stefan

Versuch mal das Parent des Panels per Invalidate neu zu zeichnen. Ich nehme mal an, ParentBackground des Panels ist True?

stahli 12. Jul 2019 13:09

AW: Transparente Bereiche werden nicht aktualisiert
 
Arbeitest Du mit mit der VCL?

Es gibt da keine wirklich transparenten Controls.

Wenn Du das einigermaßen umsetzen kannst wird der Hintergrund letztlich in das Panel kopiert.
Wenn Du das Panel dann verschiebst, sieht das aus wie ausgeschnitten (ist es ja auch).

Wie man das am besten heilt kann ich nicht sagen und es kann auch auf jedem System und jeder Delphi-Version wieder etwas anders (besser/schlechter) funktionieren.

Mit FMX könnte das vielleicht besser gehen, aber da gibt es wieder andere Nachteile.

EWeiss 12. Jul 2019 14:51

AW: Transparente Bereiche werden nicht aktualisiert
 
Zitat:

Wenn Du das einigermaßen umsetzen kannst wird der Hintergrund letztlich in das Panel kopiert.
Wenn Du das Panel dann verschiebst, sieht das aus wie ausgeschnitten (ist es ja auch).
Richtig!
Die Lösung habe ich gepostet.

Zitat:

Versuch mal das Parent des Panels per Invalidate neu zu zeichnen. Ich nehme mal an, ParentBackground des Panels ist True?
Bringt gar nichts.
Indem man das Parent zwingt sich neu zu zeichnen bekomme ich den Inhalt des Parent nicht in mein Panel.

gruss

Uwe Raabe 12. Jul 2019 15:14

AW: Transparente Bereiche werden nicht aktualisiert
 
Zitat:

Zitat von EWeiss (Beitrag 1436609)
Indem man das Parent zwingt sich neu zu zeichnen bekomme ich den Inhalt des Parent nicht in mein Panel.

Die VCL ist da dann doch nicht ganz so stumpf. Wenn ParentBackground gesetzt ist, dann führt das Invalidate ein InvalidateRect auf das Parent.Handle aus. Insofern ist das schon nicht so falsch gedacht. Es ist ja auch nicht das Panel selbst, das den Hintergrund zeichnet, sondern eben das Parent-Control. Das Panel übermalt diesen halt in seiner eigenen Paint-Routine dann nicht mehr.

Zitat:

Zitat von skoschke (Beitrag 1436562)
Sobald das Panel per Code verschoben wird, wandert der transparente Bereich mit, als wenn er ausgeschnitten worden wäre!

Ich hätte dazu jetzt gern ein kleines Beispiel-Programm, mit dem man diesen Fehler nachvollziehen kann.

EWeiss 12. Jul 2019 15:27

AW: Transparente Bereiche werden nicht aktualisiert
 
Zitat:

Die VCL ist da dann doch nicht ganz so stumpf.
Nun gut.. Ich mache es ohne VCL alles von Hand und es funktioniert.
Zitat:

Es ist ja auch nicht das Panel selbst, das den Hintergrund zeichnet
Bei mir schon es wird der Hintergrund in das Panel gezeichnet.
Siehe Shot.. Panel in Panel und beide übernehmen den Inhalt des Hauptfensters. (JA nicht 100% Transparent aber emuliert! )
Zudem verlieren meine Panels den eigenen Inhalt nicht.. wenn dem so wäre könnte man die Rahmen der Panels nicht mehr erkennen.

Mein Window wird so erstellt..
Delphi-Quellcode:
FHPanel := CreateWindowEx(WS_EX_TRANSPARENT, SKPANEL, '', Style, Left, Top, Width, Height,
  ParentHandle, DlgItemID, SkinEngine.skInstance, nil);
Inklusive den Property Style BS_GROUPBOX.

Bin raus.. da es hier um VCL geht.

gruss

skoschke 15. Jul 2019 06:10

AW: Transparente Bereiche werden nicht aktualisiert
 
Hallo,

es funktioniert nun so wie gewünscht, der Tip mit dem Invalidate des Parents war der entscheidende!

Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 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