Wenn es so abläuft, wie in anderen Controls mit den Overlays, dann müssen die Overlays zwingend in derselben ImageList liegen, wie die anderen Icons.
Das gerade nicht, weshalb mir die Implementierung mit OnGetImageIndexEx sehr gut gefällt. Man ist nicht gezwungen, wild zusammengewürfelte Endlos-Imagelisten zu bauen.
Kannst du mal versuchen, die Overlay-Imagelist so aufzubauen, daß die Overlay-Indices in dieser Liste alle >= 15 sind? In dem Fall kann das
API-Handling für Overlays nicht mehr verwendet werden.
Ich war praktisch zeitgleich mit deinem Post auch an genau der Sache dran. Der entsprechende Hinweis findet sich als Kommentar in der Virtualtrees.pas:
Delphi-Quellcode:
// If the user returned an index >= 15 then we cannot use the built-in overlay image drawing.
// Instead we do it manually.
Genau das war - rein zufällig - bei mir der Fall. So lange ich es mit OnGetImageIndex implementiert hatte, lagen alle Images gemeinsam in einer Imagelist und die Overlay-Images lagen alle oberhalb von Index 15. Wenn ich nun hier einen Overlay-Index kleiner 15 angebe, dann funktioniert das Overlaying auch in OnGetImageIndex nicht mehr.
Sollte das funktionieren, wäre das dann ein Bug im VTV. Ist es aber wohl in jedem Fall, aber dann wüsste ich wie er zu beheben ist.
Ob es ein Bug ist sei mal dahin gestellt. Das scheint durchaus Absicht zu sein:
Delphi-Quellcode:
if (ImageInfo[iiOverlay].Index > -1) and (ImageInfo[iiOverlay].Index < 15) then
ExtraStyle := ILD_TRANSPARENT or ILD_OVERLAYMASK and IndexToOverlayMask(ImageInfo[iiOverlay].Index + 1)
else
ExtraStyle := ILD_TRANSPARENT;
Allerdings durchschaue ich noch nicht so ganz, was die zusätzlichen Extrastyles bewirken sollen wenn der ImageIndex < 15 ist. Würde man auf diese Extrawürste verzichten, müsste es nach meiner Logik eigentlich immer funktionieren.