Symbole für den Baum


So ganz ohne Images wirkt unser Tree-View aber nicht. Oder? Also, dann wollen wir mal ... Wir hätten nun die Möglichkeit, das einfache Prinzip der List-View (s. hier) zu wiederholen, da wir auch hier eine ImageList brauchen. Die Grundlagen (sprich: Liste erzeugen, Icons laden und zuweisen) sind nämlich identisch. Aber auch hier wollen wir das System zu Hilfe nehmen und die Symbole verwenden, die Windows für Ordner benutzt. Es entspricht also dem erweiterten Prinzip der List-View. Vorteil: das Beispielprogramm benutzt, abhängig vom laufenden Betriebssystem, die gewohnten Symbole aus dem Explorer.

Fangen wir mit der Imageliste an. Das System stellt uns das Handle dieser Liste zur Verfügung, wenn wir die Funktion SHGetFileInfo mit dem Flag SHGFI_SYSICONINDEX aufrufen. Da uns außerdem nur die kleinen Symbole interessieren, geben wir das Attribut SHGFI_SMALLICON gleich mit an:

hSmallImg := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi),
  SHGFI_SYSICONINDEX or SHGFI_SMALLICON));

Der Rückgabewert der Funktion ist das Handle der Imageliste, die wir an den Tree-View weiterreichen:

if(hSmallImg <> 0) then
  TreeView_SetImageList(hTreeview,hSmallImg,TVSIL_NORMAL);

So weit, so gut.

Beim Einlesen der einzelnen Ordner benutzen wir nun die Funktion ein weiteres Mal und holen uns den Index der jeweiligen Symbole. Das hat damit zu tun, dass nicht alle Ordner das selbe Bild benutzen. Denken Sie an Ihre Favoriten, an den Verlauf, an die Eigenen Dateien, usw.
Das Beispielprogramm enthält zu diesem Zweck gleich zwei überladene Funktionen. Standardmäßig wird dabei die zweite benutzt, die das Symbol des Ordners mit Hilfe des IShellIcon-Interfaces ermittelt. Das hat damit zu tun, dass bspw. der "Eigene Dateien"-Ordner mit der ursprünglichen Variante Probleme hatte und nicht das korrekte Symbol angezeigt wurde. Sollte die Funktion Probleme haben und das Symbol aus irgendwelchen Gründen nicht ermitteln können, wird auf die andere Variante ausgewichen.
Beachten Sie bitte beim folgenden Aufruf den letzten Parameter, der darüber entscheidet ob das normale Ordnersymbol (= false) oder das Symbol des geöffneten Ordners (= true) benutzt werden soll.

tvi.item.iImage         := GetShellImg(iDesktopFolder,pidlNode,false);
tvi.item.iSelectedImage := GetShellImg(iDesktopFolder,pidlNode,true);


Neue Flags braucht der Tree-View ...

Von unseren Bildchen haben wir allerdings nichts, solange wir nicht den Code beim Scannen der Partitionen entsprechend ergänzen. Schauen wir uns die Sache noch einmal an. So sieht es bisher aus:

tvi.item.mask    := TVIF_TEXT;
tvi.item.pszText := ds.cFileName;

Zuerst erweitern wir die Flags, so dass auch die Symbole berücksichtigt werden. Da wir das normale und das geöffnete Ordnersymbol haben, benötigen wir auch die Flags für das normale und selektierte Image:

tvi.item.mask    := TVIF_TEXT or TVIF_IMAGE or TVIF_SELECTEDIMAGE;

Voilą, das war“s. Unser Tree-View "erstrahlt" mit den Ordnersymbolen des Systems.