Der Tree-View dürfte Ihnen von der VCL-Programmierung und diversen Programmen bekannt sein. Typischerweise wird er benutzt, um Informationen verschiedener Art baumartig anzuordnen. Der Windows Explorer ist ein solches Beispiel.
Das Erzeugen des Tree-View geht, wie bekannt, mit "CreateWindowEx" vonstatten, wobei wir den Klassennamen WC_TREEVIEW benutzen:
hTreeview := CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,nil, WS_VISIBLE or WS_CHILD or TVS_HASLINES or TVS_LINESATROOT or TVS_HASBUTTONS,0,0,10,10,wnd,IDC_TREEVIEW,hInstance,nil);
Die Besonderheit in obigem Codeauszug sind die Attribute, die mit den normalen Fensterstilen angegeben werden können. Ich habe für dieses Beispiel die folgenden Flags benutzt und so einen typischen Tree-View erzeugt:
| Wert | Bedeutung |
|---|---|
| TVS_HASLINES | der Tree-View zeigt die typischen Linien zwischen den Elementen |
| TVS_LINESATROOT | zeigt die Linien auch für die obersten Knoten der Hierarchie; TVS_HASLINES muss aber gesetzt sein, sonst wird das Flag ignoriert |
| TVS_HASBUTTONS | der Tree-View besitzt die bekannten Plus/Minus-Schaltflächen zum Ein- und Ausblenden von Knoten |
Weitere, zum Teil bekannte, Stile sind
| Wert | Bedeutung |
|---|---|
| TVS_CHECKBOXES | jedes Item besitzt eine Checkbox |
| TVS_EDITLABELS | der "in place"-Editor kann zum Ändern der Itembezeichnungen verwendet werden |
| TVS_SINGLEEXPAND | ein Klick genügt, um einen Knoten zu öffnen; ein evtl. anderer offener Knoten wird geschlossen (es sei denn, der Anwender hält die STRG-Taste gedrückt) |
| TVS_TRACKSELECT | aktiviert das "Hot tracking", ein Item wird bereits durch "Kontakt" mit dem Mauszeiger markiert |
Bleiben wir für den Augenblick dabei und schauen uns eine kleine Zusatzfunktion des Beispielprogramms an: es ist möglich, ein paar Stile zur Laufzeit zu ändern. So lassen sich die Linien und Buttons sowie das "Hot tracking" ab- und anschalten.
Das Programm benutzt dazu eine kleine Funktion, die den Stil des Tree-View verändert und das Ergebnis (zwecks Kennzeichnung im Hauptmenü) zurückliefert:
function SetStyle(hTV: HWND; dwNewStyle: dword): dword; var dwStyle : dword; begin dwStyle := GetWindowLong(hTV,GWL_STYLE);
if(dwStyle and dwNewStyle = 0) then SetWindowLong(hTV,GWL_STYLE,dwStyle or dwNewStyle) else SetWindowLong(hTV,GWL_STYLE,dwStyle and not dwNewStyle);
Result := GetWindowLong(hTV,GWL_STYLE); end;
Eine ähnliche Funktion kennen wir schon von der List-View und dem Umschalten der Ansicht. Im Fall des Tree-View, übergeben wir der Funktion das Handle desselben und das gewünschte Flag, das wir ein- oder ausschalten wollen. Nehmen wir als Beispiel das "Hot tracking", das sich im Beispielprogramm gleich aus zwei Flags zusammensetzt:
SetStyle(hTreeview,TVS_TRACKSELECT or TVS_SINGLEEXPAND);
Würden Sie die Funktion ein weiteres Mal aufrufen, würden die Flags wieder entfernt werden, und das "Hot tracking" wäre deaktiviert.