CListBox: Darstellung aktualisieren

Palador

Grünschnabel
Hallo allerseits.
Ich hab ein kleines Problemchen. Ich habe eine ListBox erstellt, die auch Icons darstellen kann, ähnlich wie im Tut bei codesource.net. Das auch sehr schön.

Problem:
Wenn ich dann in der Listbox ein Item anklicke, dann wird es erst Blau (makiert) dargestellt, wenn ich noch ein Item hinzufüge.
Es wird nach dem Klick also nicht DrawItem(...) nochmal aufgerufen.

download programm (auf der seite auf den link klicken, direkte links werden leider nicht erlaubt :( )

Was soll ich nun tun, damit beim klick auch alles schon seleceted ist?
danke,
Palador
 
Rufst Du die entsprechende Funktion der Basisklasse auf? Ich nehme an, Du hast das von CListBox abgeleitet. Dann solltest Du in jeder abgeleiteten Funktion die entsprechende Funktion der Basisklasse aufrufen, es sei denn, Du willst genau das vermeiden.
 
Was meinst du damit? Ich hab in der abgeleiteten Klasse doch lediglich DrawItem und MeasureItem verändert. Die anderen Funktionen werden doch 1:1 übernommen oder? Die Frage ist ja auserdem auch noch welche Funktion. UpdateWindow() nicht. Ich hab jetzt immer das versucht, was auch ging:

Code:
int i;
i = m_ListBox.AddString("");
m_ListBox.DeleteString(i);

ist aber natürlich nicht so schön. Da es aber geht wirft sich jetzt eine neue Frage auf: wo muss ich die aktualisierung einbringen? Ich hab schon OnSelChange probiert, geht aber nicht .
 
Du musst an der Stelle, wo OnLButtonDown behandelt wird den Bereich des Items als dirty markieren.
Das machst du mit InvalidateRect. Das passende RECT erhältst du über GetItemRect.

Wenn du keinen OnLButtonDown-Handler drin hast, lass dir einen einrichten, ruf ganz oben die Basisklassen-Funktion auf und setz dann das InvalidateRect mit dem GetItemRect raus. Eventuell musst du dir das selektierte Item vor dem Basisklassenaufruf merken und danach darauf auch ein InvalidateRect aufrufen. Dadurch wird das "alte" selektierte Item ent-bläut (Hier, euer Bläuheit, eure schöne bittere Medizin!)
 
Wie dumm.
Das alles hätte so eigentlich nicht passieren sollen.
Im oben genannten Tut war die Bedingung dafür, dass das Item blau (selektiert) ausgemalt wird:
Code:
if ((lpDrawItemStruct->itemState & ODS_SELECTED) && (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
ohne den Actionteil es jetzt wunderbar:
Code:
if(lpDrawItemStruct->itemState & ODS_SELECTED)
Ich hoffe ich hab euch damit nicht zu dolle belastet.
Auf jeden fall danke für die Hilfe!
MfG
Palador
 
Zurück