Forum: PC-Programmierung MFC, Listbox


von Simon K. (simon) Benutzerseite


Lesenswert?

Hallo,

Folgende Situation:

Ich benutze Visual C++ 6.0 mit den MFC und habe folgendes vor:

Auf einem Dialog ist eine ListBox. Diese ListBox versuche ich per 
CListBox zu befüllen.
Dieses CListBox scheint aber so konstruiert zu sein, dass zu jedem Item 
ein void* gehört, der normalerweise auf ein CString Objekt zeigt, dass 
den Namen angibt, des jeweiligen Elements.

Ich möchte diesen void* jetzt aber für meine eigenen Zwecke benutzen. 
Sprich: Nicht auf ein CString Objekt zeigen lassen, sondern auf eine 
andere Klasse, die neben dem Namen auch noch andere Attribute enthält.

Damit das ListBox Element auch ordnungsgemäß dieses ausgetausche Objekt 
benutzt, habe ich noch DrawItem überschrieben.

Das ganze funktioniert ganz gut. Allerdings hab ich das Problem, dass 
ich beim erstellen eines neuen ListBox-Elementes per AddString(..) auch 
automatisch ein CString Objekt miterzeuge, dass anschließend per 
SetItemDataPtr(MeineKlasse); aber eh wieder "herausfliegt".

Ich versuche jetzt also irgendwie den eigentlichen "CString-Mechanismus" 
irgendwie herauszukriegen. Gibt es da irgendeine Möglichkeit?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

CListBox verwendet den per Set/GetItemData manipulierbaren Wert 
überhaupt nicht, auch nicht zur Speicherung von den in der Listbox 
enthaltenen Texten. Da hast Du sicherlich was falsch verstanden.

Wo nun Dein Problem genau liegt, vermag ich Dir mangels Quelltext nicht 
zu sagen - wenn Du den mal posten würdest, könnte ich Dir sicherlich 
mehr dazu sagen (ich arbeite seit mehr als zehn Jahren mit der MFC).

von Simon K. (simon) Benutzerseite


Lesenswert?

Rufus t. Firefly wrote:
> CListBox verwendet den per Set/GetItemData manipulierbaren Wert
> überhaupt nicht, auch nicht zur Speicherung von den in der Listbox
> enthaltenen Texten. Da hast Du sicherlich was falsch verstanden.
>
> Wo nun Dein Problem genau liegt, vermag ich Dir mangels Quelltext nicht
> zu sagen - wenn Du den mal posten würdest, könnte ich Dir sicherlich
> mehr dazu sagen (ich arbeite seit mehr als zehn Jahren mit der MFC).

Doch, CListBox verwendet diesen Parameter (den man per Set/GetItemData 
verändern kann) um ein LPCTSTR zu übergeben auf den Text des 
Listenelements.

Die "offizielle" MSDN Variante* diesen Text in DrawItem auszugeben 
lautet wie folgt:
1
LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData

Und wenn ich AddString benutze, und anschließend SetItemData auf das 
hinzugefügte Item anwende, ist der String von AddString futsch, und es 
wird (je nach SetItemData Aufruf) mist, oder etwas anderes angezeigt.


*http://msdn2.microsoft.com/en-us/library/kc9hahtd(VS.80).aspx

PS: Hab das ganze jetzt etwas anders gelöst. Ich belasse es bei 
AddString und lasse dieses ItemData setzen. Und wenns in DrawItem zum 
zeichnen kommt, hol ich mir per "GetElementByName" Funktion weitere 
Infos aus meiner Linked-List anhand des Listenelementnamens.

von Karl H. (kbuchegg)


Lesenswert?

Simon Küppers wrote:

> Doch, CListBox verwendet diesen Parameter (den man per Set/GetItemData
> verändern kann) um ein LPCTSTR zu übergeben auf den Text des
> Listenelements.
>
> Die "offizielle" MSDN Variante* diesen Text in DrawItem auszugeben
> lautet wie folgt:
>
>
1
LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData

Da hast du was falsch verstanden.
Das gilt nur wenn du eine 'Owner Drawn' Listbox hast. Und
auch nur dann brauchst du eine spezielle DrawItem Funktion.

Bei einer ListBox 'out of the box' verwendet die ListBox
den ItemData überhaupt nicht. Die Listbox zeigt lediglich
den übergebenen String für das Item an. Mit dem ItemData
kann man dann noch zusätzlich beliebige Daten an das Listbox
Item binden.

von Simon K. (simon) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:
> Simon Küppers wrote:
>
>> Doch, CListBox verwendet diesen Parameter (den man per Set/GetItemData
>> verändern kann) um ein LPCTSTR zu übergeben auf den Text des
>> Listenelements.
>>
>> Die "offizielle" MSDN Variante* diesen Text in DrawItem auszugeben
>> lautet wie folgt:
>>
>>
1
LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData
>
> Da hast du was falsch verstanden.
> Das gilt nur wenn du eine 'Owner Drawn' Listbox hast. Und
> auch nur dann brauchst du eine spezielle DrawItem Funktion.
>
> Bei einer ListBox 'out of the box' verwendet die ListBox
> den ItemData überhaupt nicht. Die Listbox zeigt lediglich
> den übergebenen String für das Item an. Mit dem ItemData
> kann man dann noch zusätzlich beliebige Daten an das Listbox
> Item binden.

Nene, das habe ich schon richtig verstanden :-) Ich will ja meine eigene 
(als Attribut in der abgeleiteten CListBox Klasse) Single-Linked list 
benutzen um beim Zeichnen auch noch Farbe mit ins Spiel zu bringen. 
(Jeder Listeineintrag der SLL besteht zB aus einem Text, und einer 
Farbe).
In DrawItem zeichne ich die ListBoxElemente mit der richtigen Farbe und 
dem richtigen Text.
Das ganze muss also OwnerDrawn sein.

 Simon Küppers wrote:
>Damit das ListBox Element auch ordnungsgemäß dieses ausgetausche Objekt
>benutzt, habe ich noch DrawItem überschrieben.


edit: Habe mal die betreffende Klasse angehangen. Geht nicht im Edit..

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

hier aber.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.