![]() |
VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
Das Malen der Icons ist kein Problem.
Code verkürzt. Alles Unwichtige ist raus
Delphi-Quellcode:
Wie bewege ich den VirtualStringTree nun dazu, die Bilder in die richtige Zelle zu malen, wenn hoDrag der Header-Optionen aktiviert ist und man die Headeranordnung vertauscht?
procedure TKSTData.VSTAfterItemPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var R: TRect; IconPosLeft, IconPosTop: Integer; begin R := ItemRect; // IconList ist eine PNGImageList dessen Height-Eigenschaft ich auslese um zu wissen, wie hoch mein Icon ist IconPosTop := (R.Height div 2) - (IconList.Height div 2); // Icon in der Y-Achse zentriert anordnen IconPosLeft := R.Left + IconList.Width - 3; // Icon in der X-Achse etwas weiter links anordnen, nicht zentriert IconList.Draw(TargetCanvas, IconPosLeft, IconPosTop, 1); end; |
AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
Ich glaube du solltest dir die Events des VSTs besser anschauen. Da gibt es OnGetImageIndex für die erste Column. Dann gibt es OnBeforeCellPaint und OnAfterCellPaint. Die werden jeweils für eine Zelle aufgerufen und geben auch den ColumnIndex mit der sich auch nach dem Verschieben der Columns nicht ändert. OnAfterItemPaint ist hier definitiv das falsche Event.
|
AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
Zitat:
Lohnt sich ein Umbau auf GetImageIndex? Denn ich male mehrere Bilder in die erste Zelle. Nicht nur eines. |
AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
OnGetImageIndex ist ein Event dem du nur den ImageIndex aus der zugewiesenen ImageList gibst. Dort kann ein Image pro Column/Zelle gezeichnet/angegeben werden. Um schnell ein Image im VST anzuzeigen ist das definitiv einfacher. Wenn du die Position aber bspw. je nach Länge des Texts anpassen willst, dann solltest du OnBeforeCellPaint oder OnAfterCellPaint nutzen.
EDIT: Ich hatte mich bei meiner erste Antwort vertan.
Delphi-Quellcode:
procedure vstGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer);
|
AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
OnAfterCellPaint (mit Abfrage, ob ich in der richtigem Column bin) statt OnAfterItemPaint?
Da ich mehrere Icons pro Zelle zeichne, brauche ich OnGetImageIndex dann ja wohl nicht. |
AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
OnAfterItemPaint benutzt man eigentlich recht selten.
Anbei mal die Reihenfolge der Events (Auszug aus der Hilfe des VST): Zitat:
|
AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
Habe gerade eben den Code auf das AfterCellPaint-Event umgebaut.
Hier eine kleine Änderung und dort und alles arbeitet perfekt. Dort kann ich nun auch abfragen, in welche Zelle ich bin und auch nur dann den Code ausführen. Ich schätze, dass das auch Performancevorteile mit sich bringen könnte. |
AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
Die richtigen Events für den richtigen Zweck zu nutzen bringt eben diverse Vorteile ;)
|
AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
Im OnAfterItemPaint hatte ich kurzzeitig eine Variante, die sogar das gewünschte Ergebnis brachte.
Dabei habe ich VST.Header.Columns[0].Left abgerufen und so erfahren, wo sich meine erste Zelle befindet. Hat geklappt. Vorher wurden die Icons vermutlich auch so oft pro Node gezeichnet wie das VST Columns hat. Aber die jetzige Lösung ist um Welten besser, da ich auch die Column abfragen kann und so gezielt zeichnen kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz