![]() |
Position des MenuItems Canvas bei zeichnen im Menu ermitteln
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.
Delphi-Quellcode:
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.
type TAdvancedMenuDrawItemEvent = procedure (Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState) of object;
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:
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.
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 ... 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. |
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
ARect enthält definitiv das richtige Rechteck zu dem Menuitem was du malen sollst. Woher kommt deine Meinung, dass ARect Müll ist?
|
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
Weil es bei mir alles in die erste Zeile (Item) schreibt wenn ich das Reckt nicht anpasse.
|
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, Beispielprojekt gemacht. Von Schönheit im gemalten Menu brauchen wir nicht zu sprechen, aber funktionieren tut alles wie behauptet. Das ARect liefert immer das passende Rechteck! Siehe Anhang.
Vermutung: Hast du OnAdvancedDrawItem nur dem ersten Menueintrag zugewiesen? |
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
Danke erstmal. Ich werde es gleich genauer studieren und melde mich gleich wieder.
|
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
Da bin ich wieder und muß zugeben, daß mir das Ganze jetzt ziemlich peinlich ist.
Manchmal fängt man etwas in dem man den Plan A verfolgt. Später ändert man schon mal den Plan und geht zu Plan B über. Allerdings ist man oft zu faul alles aus Plan A in die Tonne zu kloppen und erstellt Plan B oft mit Teilen aus Plan A. So auch hier. Ich hab den Code den ich zu einem anderen Objekt geschrieben habe zum Teil auch hier verwendet, anstatt alles neu zu schreiben. Das sonderbare dabei ist, daß ich ARect bereits bei State Informationen und Icons korrekt eingesetzt habe. Die Icons waren korrekt platziert, der Selected Balken korrekt gezeichnet, nur der Text wurde an falscher Stelle geschrieben. Wieso mir das nicht aufgefallen ist weiß ich nicht. Anscheinend hab ich mich nur auf den Text konzentriert. Das ist mir aufgefallen als ich denen Code studiert habe. Manchmal muß man sich nur etwas von dem Problem entfernen um es zu erkennen. |
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
Hauptsache es funktioniert...
|
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
Hauptsache es funktioniert, ist mir in der Regel zu wenig. Sagen wir lieber: schön daß es funktioniert und der Fehler erkannt wurde.
PS: Kennst du dich gut aus mit Menüs? Ich hab da noch eine Frage bezüglich Zugriff auf die Images List des Popups und der Frage wie ich aus OnAdvancedDrawItem drauf zugreifen kann. Falls die Kenntnisse da sind, würde ich eine Ausführliche Frage in einem neuen Thread stellen. |
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
Zitat:
![]() |
Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
Ich sehe ich sollte mir die Hilfe bezüglich Menüs nochmal ansehen. Seit Delphi 3 habe ich mir die nicht mehr angeguckt, da ich Menüs nicht zeichnete. Anscheinend ist einiges dazugekommen.
Das Problem habe ich so hingekriegt, nur gefiel mir der Code nicht:
Delphi-Quellcode:
Aber danke für den Tipp.
with TMenuItem(Sender), ACanvas do
begin ... TPopupMenu(GetParentComponent).Images.GetIcon(ImageIndex, Ico); Draw(x, y, Ico); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 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 by Thomas Breitkreuz