Angeklicktes Item in TreeView finden

langer1801

Erfahrenes Mitglied
Brauche mal Hilfe bei meiner TreeView-Klasse. Wie komme ich denn an das Item, das angeklickt wurde? Ich habe mir vom Assistenten eine Funktion für die Meldung TVN_SELCHANGED einbauen lassen und dann anhand der Beispiele, die ich hier im Tutorial gefunden habe, die HitTest-Funktion eingebaut.
Code:
void CAbr2TreeView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
	unsigned int uFlags;
	POINT pt;
	GetCursorPos( &pt );
	CTreeCtrl& leftTree = GetTreeCtrl();
	leftTree.ScreenToClient( &pt );
	HTREEITEM hItem = leftTree.HitTest( pt, &uFlags );
	*pResult = 0;
}
Die Funktion wird auch angesprungen. Bin dann mit dem Debugger durchgegangen und habe mir alle Strukturen angesehen, aber ich komme nicht dahinter, wo ich nun mein Item finde. Ich vermute mal, daß es itemNew in pNMTreeView ist, allerdings steht da unter pszText nicht der Text des Items, das ich angeklickt habe, sondern nur Unsinn.

Mfg

langer
 
Benutz doch einfach GetSelectedItem, um das Item rauszufinden?

Das itemNew und itemOld hat laut MSDN nur die Werte mask, hItem, state und lParam richtig gesetzt, den pszText nicht! Den Text musst du dir nachträglich per GetItemText holen.
 
Warum einfach, wenns auch kompliziert geht :-( . Mit deinem Tip klappt es prima. Allerdings ist es sehr schwierig, sich neu in das Thema CTreeView reinzufinden, wenn man das also zum ersten Mal implementiert. Ich hatte stundenlang im Tutorium und in der MSDN gesucht, aber ohne Hilfe....nee, ich wäre nicht weitergekommen, zumal die angebotenen Beispiele meist nur Schnipsel sind und deshalb schwer zu durchschauen. Und die Intellisense bietet für Items soviel Funktionen an, daß man zu Anfang gar nicht weiß, welche nun was macht :confused: .

Mfg

langer
 
Ich hab jetzt im Moment nur noch eine Frage:
Die Initialisierung in der Funktion OnInitialUpdate, in der die Funktion OnTvnSelchanged mehrfach angesprungen wird, will ich ausblenden. Ich habe keine Funktion gefunden, die mir das Anklicken des Items meldet. Deshalb frage ich in der Funktion den Parameter ptDrag ab und prüfe, ob ptDrag.x oder ptDrag.y ungleich 0 sind. Bei meinen Versuchen war das immer nur der Fall, wenn das Item mit der Maus angeklickt wurde, die zu implementierenden Funktionen werden dann nur ausgeführt, wenn ich auch ein Item angeklickt habe. Nun zu meiner Frage:
1. Kann man sich darauf verlassen, daß x oder y nur ungleich 0 sind, wenn mit der Maus geklickt wurde?
2. Welche Funktion hat dieser Parameter? Denn mit der Mausposition auf dem Screen stimmen die Werte nicht überein.

Mfg

langer
 
Leider klappt das nicht so, wie ich mir das vorgestellt habe. Denn wenn ich das oberste Item anklicke, sind die x- und y-Werte ebenfalls 0, d.h., ich kann das oberste Item nicht auswerten.
Nun mache ich es so, daß ich zu Beginn der Funktion OnInitialUpdate ein Flag setze und am Ende rücksetze und nur wenn das Flag nicht gesetzt ist, die Funktionen auslöse. Gibt es aber vielleicht noch eine bessere Lösung?

Mfg

langer
 
Das klappt besser, wenn du es anders herum machst. Im Constructor oder am Beginn von OnInitDialog setzt du ein Flag (bInitialising) auf true. Innerhalb der Handler prüfst du zu Beginn, ob das Flag gesetzt ist. Wenn ja, dann einfach wieder rausspringen und nichts tun. Am Ende von OnInitDialog setzt du das Flag auf false.
 
Habe mich wohl missverständlich ausgedrückt. Ich setze das Flag am Anfang von OnInitialUpdate auf true und am Ende von OnTvnSelchanged wieder zurück. Das klappt auch gut. Wenn ich das Flag schon am Ende von OnInitialUpdate wieder zurücksetze, ist das zu früh, dann gerate ich in die Bearbeitungsroutinen - was ich ja verhindern will. Na ja, ein paar Schönheitsfehler gibt's noch - nach der ersten Initialisierung is das oberste Item ausgewählt, wenn ich es dann anklicke, passiert nix - muß erstmal ein anderes auswählen. Und wenn ich einen Zweig einklappe, wird auch noch in die Bearbeitungsroutinen gesprungen - was eigentlich nicht passieren sollte. Aber das kriege ich schon noch hin ;), denke ich.

langer
 
Zurück