CListctrl Welche Zeile beim Klick in zweite Spalte
-
Hallo,
ich habe in meinem Dialog ein ListControl. Dieses wird gefüllt mit mehreren Zeilen und hat zwei Spalten.
Beim Klick in die erste Spalte bekomme ich mit folgenden Code die Zeile zurück:
Code:
POSITION pos = m_ListDaten.GetFirstSelectedItemPosition();Klicke ich aber in der gleichen Zeile aber in die zweite Spalte ist pos=NULL.
Im Grunde soll beim Klick in die zweite Spalte genau das gleiche passieren wie beim Klick in die erste Spalte.
Ebro
-
Ich nehme mal an das auch die zweite Spalte des ListControls nicht selektiert wird, sondern sich nur die erste Spalte anwählen lässt. Du musst hier den erweiterten Stil LVS_EX_FULLROWSELECT für das ListCtrl setzen. In etwa so:
m_listCtrl.SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, (WPARAM)LVS_EX_FULLROWSELECT , (WPARAM)LVS_EX_FULLROWSELECT );
-
Hallo,
danke erstmal für den Tipp. Es ist besser aber auch merkwürdiger geworden.
Bis dato hatte ich nur in OnInitDialog folgenden Code drin:m_liste.SetExtendedStyle(LVS_EX_FULLROWSELECT);Damit klappte es ja nicht. Den hab ich jetzt durch deinen Code ersetzt:
m_liste.SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, (WPARAM)LVS_EX_FULLROWSELECT , (WPARAM)LVS_EX_FULLROWSELECT );Das gleiche habe ich in der Funktion OnClickList3 nochmal eingefügt.
Jetzt passiert folgendes:
1.Beim aller ersten Klick in die erste Spalte wird auch nur die erste Spalte markiert und pos liefert die Zeile
2.Beim aller ersten Klick in die zweite Spalte wird gar nichts markiert und pos liefert NULL
3.Bei allen weiteren Klicks egal ob Spalte eins oder zwei wird wie gewollt die ganze Zeile markiert und pos liefert die entsprechende Zeile.Was kann da noch falsch sein, dass das nur beim ersten Klick nicht klappt?
Ebro
-
Ehm also ich habe das so gemacht bei OnInitDialog:
m_list.SetExtendedStyle(GetExtendedStyle() | LVS_EX_FULLROWSELECT);Und das geht wunderbar! Ich weiss jetzt nicht und bin auch zu müde es nachzulesen, aber je nach dem müssen halt wohl gewisse Einstellungen mitgeliefert werden, damit das Fullrowselect funktioniert. Durch das Holen der aktuellen Einstellungen und einfach das Hinzufügen, wird halt nur hinzugefügt und nichts gelöscht.
Grüssli
-
Ich denke dass es keine gute Idee ist, die erweiterten Stile während des Verarbeitens der Click-Nachricht (NM_CLICK) zu setzen. Wenn ich die erw. Stile des ListCtrl in der OnInitDialog wie beschrieben ändere funktioniert das ausgezeichnet. Egal ob es mit SendMessage( ... ) oder SetExtendedStyle erfolgt. Das Problem scheint woanders zu liegen.
Kannst du nicht mehr Infos posten, damit man die Umstände, die zum beschriebenen Verhalten führen, sieht ?
Wie schaut denn deine OnInitDialog aus und deine MessageMap ?
-
Moin,
danke an alle, es funzt jetzt!!!
Ich habs jetzt so gemacht. Aus OnClickList3() hab ich FULLROWSELECT rausgenommen. OnInitDialog hab ich so geändert:m_liste.SetExtendedStyle(LVS_EX_GRIDLINES); m_liste.SetExtendedStyle(LVA_ALIGNLEFT); m_liste.SetExtendedStyle(m_liste.GetExtendedStyle() | LVS_EX_FULLROWSELECT);Schönen sonnigen Sonntag.
Ebro
-
Dir ist aber klar, dass dann LVS_EX_GRIDLINES nicht vorhanden sein wird?
Ich glaube du solltest mal was zu Flags lesen.Hmmm hab nichts vernünftiges als Link gefunden, so probier ich mal selber was dazuzuschreiben ^^
Ein Beispiel:
Flag1 ist Bitweise so definiert: 0001
Flag2 ist Bitweise so definiert: 0010
Flag3 ist Bitweise so definiert: 0100
Flag4 ist Bitweise so definiert: 1000Flag1 | Flag3 = 0101
Flag2 | Flag4 = 1010
Flag1 | Flag2 = 0011usw.
Mit SetExtendedStyle setzt du diese Flags fest. Und zwar ersetzt du dabei den alten Wert durch den Wert, den du der Funktion übergibst.
Bei deinem Code den du reingeschrieben hast:m_liste.SetExtendedStyle(LVS_EX_GRIDLINES);
m_liste.SetExtendedStyle(LVA_ALIGNLEFT);
m_liste.SetExtendedStyle(m_liste.GetExtendedStyle() | LVS_EX_FULLROWSELECT);wird am Anfang alles ersetzt durch LVS_EX_GRIDLINES. Dann wird LVS_EX_GRIDLINES durch LVA_ALIGNLEFT ersetzt. Und dann wird LVA_ALIGNLEFT geholt und LVS_EX_FULLROWSELECT dazu gesetzt und das ganze ersetzt dann LVA_ALIGNLEFT. So hast du am Ende in deiner Liste ein Extended Style LVA_ALIGNLEFT und LVS_EX_FULLROWSELECT.
Und jetzt kommt noch der Hammer. LVA_ALIGNLEFT ist kein Flag des Extended Styles. Sieh mal in der MSDN nach welche Flags für den Extended Style zuständig sind. Das LVA_ALIGNLEFT ist ein normales Style Flag.
Hmmm bei uns in der Schweiz würde das heissen: "EINS, SETZEN!" (wobei man beachten muss das in der Schweiz die eins = sehr schlecht ist und 6 = sehr gut)

Ich hoffe ich konnte ein wenig weiter helfen.
Grüssli
-
Wieso nimmst du überhaupt mehrere SetExtendedStyle-Aufrufe hintereinander? Du kannst doch gleich eine OR-Kombination aller benötigten Flags mit einem Schlag setzen:
m_liste.SetStyle(LVA_ALIGNLEFT /* evt. |... */); m_liste.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
-
Hallo,
ihr habt sicher alle recht. Ich bin eben schon froh wenn das stimmt was hinten rauskommt. Ich erhebe gar nicht den Anspruch auf feinen Code. Es ist eben nur ein Hobby von vielen.Aber die Gridlines sind trotzdem da, egal wie sie da reingekommen sind.
Danke für eure Tipps. Ich werd das natürlich in meinen künftigen updates berücksichtigen.
Ebro