CListCtrl für Einsteiger



  • Hallo. Ich mal wieder mit einer Eisteiger Frage.
    Ich habe schon im Forum gesucht aber nicht das richtige gefunden. MSDN zu undurchsichtig für mich.

    Ich denke meine Frage ist aber recht simpel.

    Gehen wir von einem völlig neuen Projekt aus, mit einem Dialog in dem ich lediglich zwei Buttons und ein Listenelement habe.
    Es sind noch keine einstellungen vorgenommen.

    Button1 = "IDC_ENDE"
    Button2 = "IDC_ZEILEHINZU"
    Listenelement = "IDC_LISTE"

    Jetzt will ich nur, das bei Programmstart eine zeile mit fünf Spalten erscheint.

    Folgendes Format und Zelleninhalt:
    1.Zelle = int ; 1
    2.Zelle = int ; 3
    3.Zelle = CString ; hallo
    4.Zelle = ??? ; ein Bild!!!
    5.Zelle = int ; ein Kombinationsfeld (erstmal ohne Inhalt)

    Sollten zelle 4 und fünf für den Anfang zu Umfangreich sein bitte nur int werte statt dessen

    Wenn ich jetzt auf Button2 clicke will ich das eine weitere Zeile erscheint. Die Zellen können können leer sein.

    Ich wäre dankbar wenn mir jemad den Quellcode mit einigen Kommentaren posten würde.



  • Das ListView Control kann standardmäßig je Spalte nur einen text, und nur in den neuesten versionen auch in den Unterspalten ein Icon anzeigen. Da die Bilder aus einer ImageList kommen, ist es auch nicht so einfach, dort ein beliebiges Bild zur Laufzeit auszuwählen und reinzustopfen. Das alles von Hand zu machen ist sicher etwas hoch gegriffen, wenn dir die MSDN schon bei der Standardfunktionalität Probleme macht.

    Für deine Zwecke ist wahrscheinlich eins der vielen GridCtrl's besser geeignet, siehe z.B. http://www.codeproject.com

    Prinzipielles vorgehen:

    1. ListCtrl in dem Report Mode setzen (z.B. im Ressourceneditor)
    2. 5 Spalten Einfügen (mit InsertColumn)
    3. eine Zeile Einfügen mit InsertItem (inkl. Text für Spalte 0)
    4. Text der weiteren Spalten kann mit SetItemText gesetzt werden


  • Ich weiß nicht. Die MSDN ist in meinen Augen einfach zu blöd beschrieben.
    Selbst Dinge die ich gut verstehe kann ich in der MSDN nicht nachvollziehen.

    Aber ich denke ich suche nur Falsch.
    Mit deinen Stichpunkten hab ich mir jetzt mal aufdie schnelle eine Statische Tabelle mit fünf 7 Spalten und zwei Zeilen gemacht. Wenn man in der MSDN unter CListCtrl sucht findet man n ichts von "InsertColum" oder "InsertItem".
    Also danke für die Tipps

    Jetzt hab ich trotzedem noch die eine oder andere Frage
    1. Wie kann ich Rahmen darstellen? Denn die einzelnen Zelleninhalte sind sozusagen "freischweend"
    2. Immer noch: Wie binde ich das Icon oder eine Bitmap ein
    3. Immer noch: Wie knall ich mir da ein Kombinationsfeld rein
    4. Wie greife ich auf den inhalt Zu? (Das suche ich gerade raus. Vielleicht find ich es selber. Ist sicer sowas wie GetItemText oder so)



  • Wechsel in der MSDN mal im linken Bereich auf die Registerkarte "Index" und gib "CListCtrl" als zu suchendes Schlüsselwort ein. Dann wählst du den Untereintrag "class members" aus und schon siehst du alle zur Verfügung stehenden Methoden.



  • OOOOOOOKKKKKKKKKKK. 😮
    Ich habe schlicht und einfach den Link "Class Members" ignoriert.
    Danke schon viel übersichtlicher 🙄

    Sollte alles finden was ich suche.

    ----- EDIT -----

    Wieder nen Problem.
    Warum wird mein Icon nicht Angezeigt?
    Es gibt keine fehler wenn ich folgenden Code ausführe.

    m_imagelist.Create ( 16, 16, TRUE, 4, 4 ); 
    m_imagelist.Add ( ::LoadIcon ( AfxGetInstanceHandle (),MAKEINTRESOURCE ( IDI_ICON1 ) ) ); 
    m_liste.SetImageList ( &m_imagelist, LVSIL_SMALL );
    


  • Du hast schon recht - das suchen in der MSDN ist das schwierigste 😉

    Das beste ist, sich auf der "Inhalt" - Seite immer einen Überblick zu verschaffen, wo das, was man im Index gefunden hat, eigentlich steht. Der "Suchen" Button im Toolbar hilft dabei mächtig.

    Bei den MFC-Klassen muß man evtl. ein bißchen suchen, bis man die MFC-Variante gefunden hat, aber dann sieht es eigentlich immer gleich aus. Bei den MFC-Klassen gibt es immer einen "Overview", wo man Links auf die allerwichtigsten sachen findet, und eine liste mit Klassenmembern. Dort findet man eigentlich "alles".

    Für UI Controls schaue ich eigentlich lieber in die Win32-Doku (Platform SDK/User Interface Services/Windows Common Controls und Windows user Interface) - aber das ist Geschmackssache.

    So, jetzt zu deine Fragen 🙄

    1. Extended List View Style: LVS_EX_GRIDLINES
    2. a) Bitmap mit allen icons anlegen
      b) in CImageList laden
      c) ListCtrl mit CImageList initialisieren (SetImageList(&il, LVSIL_SMALL)
      d) image index in der Liste z.B. bei InsertItem angeben (für erste Spalte)
      e) Für icons in Spalten >0: mußt TVITEM-Struktur initialisieren (mask, iItem, iSubItem und iImage)
    3. In-Place-Control, z.B. mal bei CodeProject suchen. Im prinzip ein Combo-Control mit WS_POPUP-Style an der entsprechenden Stelle erzeugen, das sich bei WM_KILLFOCUS selbst zerstört.
    4. GetItem / GetItemText 😉

    Zu 4: Es ist "gute programmierpraxis", wenn du dir für jeden Item (Zeile) mit SetItemData() eine ID merkst, und - falls du die Daten brauchst - nicht aus dem ListControl liest, sondern mit GetItemData und Spaltennummer aus deinen Anwendungsdaten direkt holst.

    Und, wie gesagt, wenn du wei über das Standard-vermögen drüber raus willst, evtl. mal eins der viele Grid Controls



  • OK, hatte deinen Beitrag nicht vor meinem letzten Post gelesen 😉

    Beim InsertItem must du nich die Image-Indizes angeben, und die ImageList am besten einen Klassenmember von deinem Dialog machen (mus existieren, solange sie im ListCtrl verwendet wird....)



  • Danke.
    Ich glaub ich habe jetzt alles was ich brauche.

    Falls noch was ist meld ich mich


Anmelden zum Antworten