www.mikrocontroller.net

Forum: PC-Programmierung MFC, Listbox


Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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(...

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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>
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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
>>
>>
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..

Autor: Simon K. (simon) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier aber.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.