c winapi ListBox MultiSelect



  • DANKE
    stimmt muss in das WinAPI Forum
    😃 🙂



  • Schau dir mal die Nachrichten LB_GETSELCOUNT und LB_GETSELITEMS an.

    Mit Ersterer erhältst du die Anzahl der ausgewählten Einträge, mit der anderen die Indizes. Und da du in C++ programmierst, nimmst du am besten einen std::vector zur Bereitstellung des notwendigen Speichers.



  • Danke
    Ich bin hier im Forum darauf gestoßen:

    LB_GETSELITEMS:

    • wParam: Maximale Anzahl, die das Array aufnehmen kann
    • lParam: Pointer auf ein INT-Array, in dem die Indexnummer der selektierten Einträge gespeichert werden.

    Beispiel:

    #define MAXNUM 20
    int iIndices[MAXNUM];
    SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices);
    

    ok verstehe ich ABER:

    wo kann ich denn den Array angeben? 😕
    (ich will das Ergebniss ja nicht in die wüste schicken 😃 )



  • c_flo schrieb:

    wo kann ich denn den Array angeben? 😕

    Ich verstehe gerade nicht was du meinst, mit

    SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices);
    

    Übergibst du doch die Adresse, wo die Daten landen sollen.

    Und mit einem std::vector und der Überprüfung der Anzahl bist du besser beraten, die Anzahl der selektierten Einträge kann auch größer als MAXNUM sein.

    Ich hätte eher so etwas gedacht (ungetestet und zu langer Funktionsname)

    bool GetMultiSelectionListboxItemIndices(HWND listview, std::vector<int>& items)
    {
    	LRESULT count = SendMessage(listview, LB_GETSELCOUNT, 0, 0);
    	if(count==0 || count==LB_ERR)
    		return false;
    	items.resize(count);
    	LRESULT res = SendMessage(listview, LB_GETSELITEMS, items.size(), reinterpret_cast<LPARAM>(&items[0]));
    
    	return res!=LB_ERR;
    }
    


  • c_flo schrieb:

    wo kann ich denn den Array angeben? 😕 )

    Hast du doch im Beispiel, als letzter Parameter 😕



  • eigendlich programmiere ich c nicht c++

    ich verstehe das Beispiel von Thorgrim desswegen nicht ganz.

    LB_GETSELITEMS gibt aber noch kein text aus oder???



  • an "hi" :

    das letzte parameter ist doch ein integer:

    #define MAXNUM 20
    int iIndices[MAXNUM];
    SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices);
    

    oder muss ich danach anders aus der zahl den text auslesen.... 😕



  • übrigens weiß ich in meinem programm wie viele einträge insgesamt in der listbox sind und müsste dies nicht nochmal auslesen.wie viele selektiert sind weiß ich natürlich nicht... 🙂



  • kann niemand helfen??
    😞 🙄



  • bool GetMultiSelectionListboxItemIndices(HWND listview, std::vector<int>& items) 
    { 
        LRESULT count = SendMessage(listview, LB_GETSELCOUNT, 0, 0); 
        if(count==0 || count==LB_ERR) 
            return false; 
        items.resize(count); 
        LRESULT res = SendMessage(listview, LB_GETSELITEMS, items.size(), reinterpret_cast<LPARAM>(&items[0])); 
    
        return res!=LB_ERR; 
    }
    

    in zeile 3 wird dir die anzahl der markierten elemente zurückgegeben
    in zeile 4 wird abgefragt ob überhaupt elemenet markiert sind oder ob die listbox nicht eine single-selection list box ist, dann gibt sie nämlich LB_ERR zurück

    in zeile 6 wird die größe des bereiches festgelegt der später die markierten (nr) der listbox enthält.

    in zeile 7 wird dir der bereich gefüllt, mit den nr der elemente die in der listbox markiert sind.

    was dir letzten endes in der funktion GetMultiSelectionListboxItemIndices(..., std::vector<int>& items) zurückgegeben wird.

    die nr die jetzt in items stehn, kannst du dazu verwenden abzufragen welchen text das jeweils markierte element hat...

    noch fragen?



  • danke das hat mir geholfen 🙂

    noch eine frage:
    welche bibliotheken muss ich einbinden (lässt sich nicht kompilieren...)

    und in zeile 7 verstehe ich das letzte parameter nicht:

    reinterpret_cast<LPARAM>(&items[0])
    

    reinterpret_cast?? 😕



  • Möchtest du nun in C oder C++ programmieren? Was auch immer, ein wenig Eigeninitiative ist auf jeden Fall angebracht.

    std::vector, reinterpret_cast, LB_GETCOUNT, LB_GETSELITEMS.

    Wie aus den ersten google-Treffern ersichtlich wird, bist du auf der Suche nach C++-Themen sehr gut bei cplusplus.com und bei WinAPI-Themen bei MSDN aufgehoben.



  • reinterpret_cast ist doch ein c++ befehl
    ich programmiere aber c

    desswegen auch die frage mit der bibliothek

    kann ich eine listbox mit MultiSelectauch auch in c auslesen?

    🙂


Anmelden zum Antworten