MFC ListBox



  • Hallo,
    ich habe eine variable Menge von Filtern. Diese soll der Nutzer einzeln ein- und ausschalten können. Das heißt, es soll eine mehrfach auswahl möglich sein.

    Im Prinzip ein Fall von Checkboxes. Da es eine variable Menge ist und es schon mehr werden können, finde ich aber Checkboxen trotzdem ungeeignet.

    Beim Überlegen ist mir die Idee gekommen, dass eine ListBox gut aussehen würde, bei der man mehrere Zeilen anwählen kann.
    Habe es mir so vorgestellt, dass man auf eine Spalte klickt und diese an- oder abgewählt wird - der Rest soll unberührt bleiben. Und wenn der Status (also an- oder abgemeldet) sich ändert soll eine Methode aufgerufen werden.

    Nun habe ich 2 Probleme:
    Das an bzw. abwählen funktioniert nicht so wie ich es mir vorgestellt habe. Wenn ich normal klicke, wird nur dieses Element angewählt. Und wenn ich auf ein angewähltes Element klicke, wird es nicht abgewählt.
    Wenn man mit gedrückter Strg-Taste auf ein Element klickt, dann ist das Verhalten genau so, wie ich es mir vorstelle.
    Kann ich dies irgend wie umstellen, dass das auch ohne Strg geht? Oder ist ein anderes Element sinnvoller?

    Zweite Problem:
    Ich habe den Message-Map eintrag noch nicht gefunden, der ausgelöst wird, wenn sich eine Anwahl ändert.

    BEGIN_MESSAGE_MAP(..., ...)
       //ON_LBN_SELCHANGE(LST_FILTER, OnFilterChanged)//wird nicht ausgelöst
       //ON_BN_CLICKED(LST_FILTER, OnFilterChanged)//wird nicht ausgelöst
       //ON_LBN_SETFOCUS(LST_FILTER, OnFilterChanged)//wird nicht ausgelöst
    END_MESSAGE_MAP()
    

    Was ist hier der richtige Eintrag?

    Da ich es in ein bereits bestehendes Programm noch hinein bauen will, habe ich mich bei der Erstellung an dem bereits vorhandenen orientiert, weshalb es im Moment so gemacht wird:

    //in Header
    CListCtrl m_filter;
    
    //in cpp in OnCreate
    m_filter.Create(LVS_REPORT | LVS_ALIGNLEFT | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS |
    	  WS_BORDER | WS_VISIBLE, CRect(0, 0, 0, 0), this, LST_FILTER);
    m_filter.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    m_filter.InsertColumn(0,_T("Filter"), LVCFMT_LEFT, 100, 0);
    

    Danke für die Hilfe


  • Mod

    1. Hats Du mal LBS_MULTIPLESEL verwendet? Damit solle das einfache an- und abwählen gehen.
    2. LBN_SELCHANGE sollte Dich benachrichtigen. Was dann aber selektiert ist musst Du selber ermitteln (LB_GETSELITEMS).
    3. Hast Du Dir schon mal CCheckListBox angesehen

    Allerdings verstehe ich Deinen Code nicht. Da geht es nicht um ene ListBox, da geht es um einen ListViewim Reportmodus und das ist was ganz anderes.
    Auch ein ListView kann Checkboxen darstellen.



  • Martin Richter schrieb:

    Allerdings verstehe ich Deinen Code nicht. Da geht es nicht um ene ListBox, da geht es um einen ListViewim Reportmodus und das ist was ganz anderes.

    Ja das Problem ist, dass ich eigntlich Oberflächen anders baue und nicht so vom Code raus. In dem Projekt, in dem ich nur was hinzufügen soll, wurde dies aber so gemacht.
    Und ich habe den Code als Vorlage genommen, den die schon für eine Liste genommen haben (ja, allerdings nicht für eine mit mehrfach Anwahl wie ich es wollte - und dass es guter code ist bezweifel ich eh 🙂 ).

    Martin Richter schrieb:

    Auch ein ListView kann Checkboxen darstellen.

    Hm, vielleicht wäre das auch schöner?
    Wie füge ich der ListBox die Checkboxen hinzu?


  • Mod

    Xaver schrieb:

    Ja das Problem ist, dass ich eigntlich Oberflächen anders baue und nicht so vom Code raus. In dem Projekt, in dem ich nur was hinzufügen soll, wurde dies aber so gemacht.
    Und ich habe den Code als Vorlage genommen, den die schon für eine Liste genommen haben (ja, allerdings nicht für eine mit mehrfach Anwahl wie ich es wollte - und dass es guter code ist bezweifel ich eh 🙂 ).

    Martin Richter schrieb:

    Auch ein ListView kann Checkboxen darstellen.

    Hm, vielleicht wäre das auch schöner?
    Wie füge ich der ListBox die Checkboxen hinzu?

    Du wirst ständig ListBox und ListView durcheinander. Was wllst Du nun? Ich verstehe in kener Weise was Du nun verwendest.

    1. Willst Du ListBox mit Checkboxen verwenden gibt es ene fertige Klasse (CCheckListBox)
    2. Willst Du einen ListView mit checkboxen ausstatten findest Du genug Stoff wenn Du nach LVS_EX_CHECKBOXES im Netzt suchst.


Log in to reply