Column zu einem Listview Window hinzufügen



  • Hi Leute,

    kann mir vielleicht mal jemand erklären wie man zu einem Listview Window ein Column hinzufügen kann, ich hab schon ne weile versucht es selbst hinzubekommen aber das ist ja sau kompliziert.
    Ich kenne das halt leider nur als "ListIcon" aus Basic aber in C ist das sehr viel komplizierter



  • Zum einfügen:

    bool InsertListViewColumn (HWND hListView, LPTSTR lpColumnName, int iWidth, DWORD dwStyle = NULL)
    {
    	static int iCol = 0;
    
    	LV_COLUMN lvc;
    
    	lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | dwStyle;
    	lvc.fmt = LVCFMT_LEFT | dwStyle;
    	lvc.cx = iWidth;
    	lvc.pszText = lpColumnName;
    	lvc.cchTextMax = 100;
    	lvc.iSubItem = iCol;
    
    	ListView_InsertColumn (hListView, iCol, &lvc);
    
    	++iCol;
    
    	return true;
    }
    

    Zum ändern:

    bool ChangeListViewColumn (HWND hListView, LPTSTR lpColumnName, int iWidth, int iColID, DWORD dwStyle = NULL)
    {
    	LV_COLUMN lvc;
    
    	lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | dwStyle;
    	lvc.fmt = LVCFMT_LEFT | dwStyle;
    	lvc.cx = iWidth;
    	lvc.pszText = lpColumnName;
    	lvc.cchTextMax = 100;
    	lvc.iSubItem = iColID;
    
    	return ListView_SetColumn (hListView, iColID, &lvc);
    }
    


  • "static"-Variablen sind aber ganz böse!



  • OK, zumindest weiß ich jetzt dass es eigentlich schon längst funktioniert hat, aber warum kann ich nicht den Title des Columns sehen?
    Ich sehe nur die Items und das die Selektion max. so breit ist die das Column, aber das Column selbst (Title ganz oben) kann ich nicht sehen 😕



  • hast du LVS_REPORT als ListView Style angegeben?

    @Jochen: erklär mal, bzw schick nen Link wo du das bereits gemacht hast.



  • Ja hab ich in Verwendung, aber es tut sich nichts neues 😞



  • Du solltest die Nummer übergeben!
    Deine Funktion tut nur für *eine* ListView! Bei einer weiteren würde es schon schiefgehen...



  • Achso! Naja, für mich reicht es ja, und wer das anders braucht, kann es anders machen.



  • Ich meine wie ich es hinbekomme damit es etwa wie folgt aussieht:

    http://www.bilder-space.de/upload/zXw2p2dBs9tSJmf.PNG

    Kann mir jemand sagen wie das geht?



  • Also, so kann das in WM_CREATE aussehen:

    case WM_CREATE:
    	InitCommonControls();
    
    	hFileView = CreateWindow (WC_LISTVIEW, "", WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS, 15, 70, 470, 299, hMain, (HMENU) LISTVIEW, g_hInst, NULL);
    	InsertListViewColumn (hFileView, "Datei", 210);
    	InsertListViewColumn (hFileView, "Größe", 70, 
    
    	ListView_SetExtendedListViewStyle (hFileView, LVS_EX_FULLROWSELECT);
    return 0;
    


  • @BitWax: Bei deinem CreateWindow ist noch nicht mal ein Name als Klasse angegeben worden, wie soll das funktionieren?
    Verwendet ihr VisualC++? Vielleicht könnt ihr euch dadurch Arbeitsschritte sparen?!



  • WC_LISTVIEW ist der Name der Klasse!? Der 1. Parameter bezeichnet die Window-Klasse, so geht das!!!

    EDIT: vllt. postest du einfach mal deinen Code, damit man nicht immer rumraten muss.



  • AH! Danke! 😃
    Ich hab die ganze Zeit nur "LISTBOX" als Klassennamen verwendet
    Super jetzt geht`s
    Vielen Dank an alle 🙂



  • ... -.-



  • Ich bräuchte noch mal eine kleine Hilfe:
    wie erreicht man es ein Item hinzuzufügen und dies über mehrere Columns hinweg?

    Beispiel:

    ---------------------------
    | Dateiname     | Größe   |
    ---------------------------
    | Item 1        | 19 KB   |  <-  "Wie krieg ich den Text '19 KB' in`s 2. Column?"
    |               |         |
    ---------------------------
    


  • bool InsertListViewEntry (HWND hListView, LPTSTR lpEntryValue, int iRowID, int iColID)
    {
    	static int iEntry = 0;
    
    	LV_ITEM lvi;
    
    	lvi.mask = LVIF_TEXT;
        lvi.pszText = lpEntryValue;
    	lvi.iItem = iRowID;
        lvi.iSubItem = iColID;
    
    	if (iColID == 0)
    		ListView_InsertItem (hListView, &lvi);
    	else
    		ListView_SetItem (hListView, &lvi);
    
    	++iEntry;
    
    	return true;
    }
    

    iRowID -> Nummer des Columns (Zählung beginnt bei 0 ⚠ )
    iColID -> Nummer der Spalte

    EDIT: Beispiel:

    InsertListViewEntry (hListview, "Datei.exe", 0, 0);
    InsertListViewEntry (hListview, "200KB", 1, 0);
    


  • danke für die Hilfe 😃

    PS: war allerdings ein kleiner Denkfehler drin ^^

    bool InsertListViewEntry (HWND hListView, LPTSTR lpEntryValue, int iRowID, int iColID)
    {
        static int iEntry = 0;
    
        LV_ITEM lvi;
    
        lvi.mask = LVIF_TEXT;
        lvi.pszText = lpEntryValue;
        lvi.iItem = iColID;
        lvi.iSubItem = iRowID;
    
        if (iRowID == 0)
            ListView_InsertItem (hListView, &lvi);
        else
            ListView_SetItem (hListView, &lvi);
    
        ++iEntry;
    
        return true;
    }
    

    iColID und iRowID waren an zwei Stellen vertauscht 😉



  • Waren sie nicht...ich war bloß eben zu blöd das oben richtig zu beschreiben. "Col" wie Column und eben Row. also sry für den Fehler in meiner Beschreibung



  • Macht ja nix, danke trotzdem für das Beispiel 😃

    Aber noch ne andere Frage:
    wenn ich als Window-Class keinen Text sondern z.B. WC_LISTVIEW oder TRACKBAR_CLASS verwende funktioniert der Teil mit WM_COMMAND nicht mit diesem Fenster?
    Wie kann ich denn sonst die Window-Events abfragen?



  • über WM_NOTIFY. dafür musst du aber einmal die MSDN bemühen, da ich keine Lust habe nur Code zu posten 😉



  • Alles klar, hat auch ganz gut funktioniert, danke 🙂

    Aber ich hätte noch zwei Fragen:
    1.)
    Ich hab die ganze "Win32 Programmers Reference" nach ListViews durchsucht und nichts gefunden um die CursorPosition zu verändern bzw. abzufragen. Ich dachte erst es geht auch mit LB\_GETCURSEL aber für LVM\_... gibts sowas nicht 😞
    2.)
    Gibt es sowas wie z.B. 'LVS_FULLROWSELECTION' um die gesammte Zeile anzucklicken?


Anmelden zum Antworten