Selektion/Deselektion von Elementen in einer Auswahlliste

simoloui

Grünschnabel
Hallo,

ich bin gerade dabei die Welt von Windows Programmierung mit MFC zu entdecken und moechte folgendes implementieren:
Ich habe ein Dialogmenu eingebaut, welches eine Auswahlliste enthaelt. Ich moechte in dieser Liste mehrere Eintraege gleichzeitig selektieren koennen. Wenn ich ein neues Element anklicke, dann sollte das vorher selektierte Element deselektiert werden. Eine Deselektion geschieht, indem ein Element zweimal angecklickt wird.

Ist ein solches Verhalten in MFC implementierbar? :confused:

Danke im Voraus!
 
Hallo,

Ich benutze in meinem Programm einen Baum (CtreeCtrl) und keine Auswahlliste (ClistBox) wie ich im letzten Beitrag erwaehnt hatte (Sorry :rolleyes: ).
Der Baum besteht aus mehreren Stufen und ich moechte mehrere Elemente derselben Stufe gleichzeitig selektieren koennen.

Hier ist ein Beispiel:

1
|
|--1.1
| |
| |--1.1.1
| |--1.1.2
| |--...
|--1.2
| |
| |--1.2.1
| |--..

Ich moechte z.B. Element 1.1.1, 1.1.2 und 1.2.1 gleizeitig selektieren koennen

Ist das in MFC moeglich

Danke im Voraus
 
Die normale Tree Control unterstützt nur Einfach-Selektionen. Da muss man schon selber drin rumhacken.

Da man aber eigentlich nie der erste mit einem Problem ist, hat das schon jemand anders gemacht:

CodeGuru
 
Hallo!

ich habe den Code von "CodeGuru" durchgelesen, und habe folgendes fesgestellt:
Die Selektion eines Elementes geschieht indem die Methode SetItemState(...) aufgerufen wird.
In meinem Programm sieht der Aufruf so aus:
myControlTree.SetItemState(hItem, 1, TVIS_SELECTED)
Die Methode setzt das unter hlitem vorhandene Element auf selektiert (TVIS_SELECTED).
Dies wird aber bei mir nicht wirksam, daher meine Frage: Gibt es eine andere maske, die die Selektion ermöglicht
Weiterhin führt der Aufruf von SelectItem(hItem) zu einer Fehlermeldung und einem Abbruch des Programms, obwohl die Daten des Elements hItem schon richtig sind.

Irgend eine Idee?

Danke im Voraus!
 
Bei SetItemState gibst du als zweiten Parameter die States an, und als dritten die Maske. Kombiniert man da beide, kann man einen State auch wieder löschen. Kreuzumständlich.

Wenn du also einfach nur einen State draufsetzen willst, musst du myControlTree.SetItemState(hItem, TVIS_SELECTED, TVIS_SELECTED) aufrufen.

SelectItem kannst du dann nicht mehr direkt verwenden, da es ja von den Multiselektionen nichts weiss. Du kannst dir allerdings die Funktion überladen und damit seine SelectItems(HTREEITEM hItemFrom, HTREEITEM hItemTo) aufrufen, indem du bei beiden Parametern dein eines hItem übergibst.
 
Hallo,

ich habe das mit dem TVIS_SELECTED gemacht, es hat leider nicht geholfen. Ich kann zwar das neue selektierte Element deselektieren, wenn ich einen falschen Wert im zweiten Parameter von SetItemState(, X, ) eingebe, ich kann aber das vorher selektierte Element durch SetItemState(, TVIS_SELECTED, TVIS_SELECTED) ncht wieder als selektiert anzeigen.

Mal eine andere Frage bzgl. dem Code von CodeGuru:
Wie soll ich vorgehen um der Methode
------------------------------------------------------------------------------------------
void CTreeCtrlX::OnLButtonDown(UINT nFlags, CPoint point)
------------------------------------------------------------------------------------------
einen Message Handler zu assoziieren, und welchen Handler muss es sein.

Der ON_WM_ONLBUTTONDOWN() nimmt keine Parameter an, und ich kann daher meine Methde nicht übergeben.:confused:

Danke im Voraus!
 
Zu 1) Kann sein, dass man da noch ein Invalidate draufpacken muss, damit das Item als selektiert dargestellt wird.

Zu 2) ON_WM_ONLBUTTONDOWN hat in der MessageMap bei mir auch keine Parameter, die werden aber trotzdem von der verknüpften Funktion erwartet.
 
1) Wie heißt dann die Maske?

2) Wie wird die Methode dann verknüpft? Meine Methode wird aufgerufen, wenn ich ein Element anklicke. Muss ich hier irgendwas einstellen?

Danke
 
1) Das Invalidate machst du nicht mit der Maske sondern manuell:

RECT rcItem;

m_TreeControl.GetItemRect( hItem, &rcItem, FALSE );
m_TreeControl.InvalidateRect( &rcItem );


2) Bei ON_WM_LBUTTONDOWN muss die Member-Funktion einfach folgende Signatur haben, was anderes geht nicht:

afx_msg void OnLButtonDown( UINT nFlags, CPoint point );
 
Zurück