Ich erstelle gerade in meinem Programm ein Menü das über OnAdvancedDrawItem neu gestaltet wird. OnAdvancedDrawItem hat ziemlich wenig Parameter, so daß einiges nicht so schnell erkennbar wird wie man es lösen kann.
type TAdvancedMenuDrawItemEvent = procedure (Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState) of object;
Mein Problem ist die Position des ACanvas innerhalb des Menüs. Wenn man das nicht berücksichtigt, dann wird alles in erste Zeile geschrieben. ARect ist auch keine Hilfe.
Nun hab ich das so gelöst, daß ich ich über MenuIndex zumindest das Item ermitteln habe und so durch multiplizieren die Position für das Rect berechnen konnte:
Delphi-Quellcode:
procedure TForm1.MenuItemAdvancedDrawItem(Sender: TObject;
ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
var
ItemHeight, ItemTop: Integer;
...
begin
with TMenuItem(Sender), ACanvas do
begin
ItemHeight := ARect.Bottom - ARect.Top;
ItemTop := (MenuIndex * ItemHeight); // <<< Vorsicht
...
Das es nicht die beste Lösung war zeigt das "Vorsicht" in der Zeile. Das steht da seit dem ich die Zeile geschrieben habe. Denn sollange es alles aktive Items sind, bestehen keine Probleme. Baut man Separator ein oder ein unsichtbares Item, ist die Rechnung für den Müll. Dann stimmt MenuIdex nicht mehr, denn er zählt nur aktive Items.
Nun hab ich ein Separator eingebaut und jetzt stimmt die Rechnung nicht mehr. Alle Items nach dem Separator werden an falscher Stelle gezeichnet.
Die Frage ist also wie kann ich die Position für ACanvas ermitteln. Irgendwas muß ich übersehen haben.