Den Tree-View erzeugen


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);



Stilattribute des Tree-View

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.