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?
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).
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.
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.
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..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.