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/)
-   -   Delphi ListBox Color "updaten" (https://www.delphipraxis.net/129658-listbox-color-updaten.html)

chri_ri 23. Feb 2009 12:52


ListBox Color "updaten"
 
Ich habe eine ListBox, dessen Hintergrundfarbe ich mit
Delphi-Quellcode:
ListBox.Color
ändere.
Das Problem ist aber, dass sich die Hintergrundfarbe nur in dem Bereich ändert, welcher mit Items gefüllt ist.
Aber sobald ich meine Anwendung z.b. kurz Minimiere und anschließend wiederherstelle ist der ganze Hintergrund ausgefüllt (wie es ja auch sein soll).

Habt ihr eventuell einen Tipp woran das liegen könnte oder wie ich dieses Problem umgehen kann?
Auf irgendwelche "Extra-Komponenten" möchte ich möglichst verzichten.


Schonmal Vielen Dank im Vorraus!



mfg. chri_ri

himitsu 23. Feb 2009 12:57

Re: ListBox Color "updaten"
 
Schonmal ListBox.Repaint bzw. ListBox.Refresh versucht? (nach'm Zuweisen von Color)

Cyf 23. Feb 2009 13:46

Re: ListBox Color "updaten"
 
Das wird nicht gehen, aber schau mal ob das hier hilft, das nehm ich bei Open GL Zeug normalerweise nach einem Resize und Anpassung diverser Parameter zum Neuzeichen (allerdings mit false als letzten Parameter, weil ich da den Hintergrund ja selbst mache).

Delphi-Quellcode:
InvalidateRect(Listbox1.Handle, nil, true);
Die API-Funktion makiert einen Bereich als ungültig und darauf sollte WM_PAINT ausgelöst werden.

taaktaak 23. Feb 2009 14:09

Re: ListBox Color "updaten"
 
genial :stupid:

Bisher hatte ich das mit
Delphi-Quellcode:
listbox1.color:=clred;
listbox1.hide;
listbox1.show;
recht unelegant gelöst

himitsu 23. Feb 2009 14:28

Re: ListBox Color "updaten"
 
Zitat:

Zitat von taaktaak
recht unelegant gelöst

geht noch schlimmer ... ganze Form oder gleich den ganzen Desktop neu zeichnen lassen.

chri_ri 24. Feb 2009 17:31

Re: ListBox Color "updaten"
 
Also erstmal Big THX!

@himitsu: Das habe ich bereits probiert.

@taaktaak: Hat's doch noch jemandem was gebracht.

@Cyf: Super :thumb: InvalidateRect() hat geklappt. Nur hat es bei mir erst gewirkt, nachdem Ich den letzten Parameter doch auf true gesetzt hatte.


DP ist doch immerwieder eines der besten Delphi-Foren.


@Cyf: Das passt zwar nicht ganz zum eigentlichen Thema und muss auch nicht unbedingt sein, aber da du etwas von "Hintergrund selbst zeichnen" erwähnt hast, würde Ich dich fragen ob du nur kurz vielleicht noch ein gutes Beispiel oder paar Tips weißt um in einer TListBox z.b. ein Bild als Hintergrund zu verwenden (ein Link reicht). Weil hatte mal vor einer ganzen Weile nach soetwas geschaut aber es hatte nie richtig so funktioniert, wie es sollte.



mfg. chri_ri

Cyf 24. Mär 2009 20:35

Re: ListBox Color "updaten"
 
Sorry, die Antwort hat ein wenig auf sich warten lassen.
Falls du einzelne Einträge mit einem Bild hinterlegen möchtest (oder lustige Einträge mit Farben hinterlegen), kannst du mal veruschen den Style auf eines der lbOwnerDrawXX (fixe oder variable Eintragsgröße) zu setzen und OnDrawItem (und ggf. OnMeasureItem) zuzuweißen. In den Ereignissen zeichnest du entsprechend (auch den jeweiligen String).

Falls es um ein Bild für den kompletten Hintergrund geht, auf dem dann normal die Einträge angezeigt werden, müsste es dann möglich sein, das Bild einmal zu zeichen und den Style auf lbOwnerDrawFixed zu setzen und den entsprechenden Teil des Bildes (oder das ganze Bild, wenns auf Rechenzeit nicht so ankommt) neu zu zeichnen.
Besser wäre hier aber die Komponente abzuleiten und auf WM_Paint zu reagieren, aber das scheint nicht auszureichen, da die Einträge wohl immer nochmal einzeln überzeichnet werden, also müsste man das auch hier überschreiben, außer du willst in deinem Bild Balken mit der eingestellten Hintergrundfarbe.

[Edit] Das mit dem WM_Paint überschreiben sollte doch gehen, einen kleinen Überblick dazu, wie die PaintBox sich zeichnet geben TCustomListBox.WMPaint, TCustomListBox.CNDrawItem und TCustomListBox.DrawItem. In WM_Paint wird eine Message erzeugt die CNDrawItem ausliest und darauf DrawItem aufruft. DrawItem ist als virtual deklariert und es zu überschreiben müsste dann eigentlich für den Hintergrund der Einträge ausreichen. Den Code hierfür müsste man eigentlich einfach ohne das FCanvas.FillRect übernehmen können.

[Edit2]Und das mit dem true bei InvalidateRect ist klar, denn das gibt ja gerade an, dass du den Hintergrund auch erneuert haben willst. :wink:


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