Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Position des MenuItems Canvas bei zeichnen im Menu ermitteln (https://www.delphipraxis.net/102596-position-des-menuitems-canvas-bei-zeichnen-im-menu-ermitteln.html)

Popov 31. Okt 2007 18:26


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:
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.

Muetze1 31. Okt 2007 18:49

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?

Popov 31. Okt 2007 18:53

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.

Muetze1 31. Okt 2007 18:54

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?

Popov 31. Okt 2007 19:18

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
 
Danke erstmal. Ich werde es gleich genauer studieren und melde mich gleich wieder.

Popov 31. Okt 2007 20:10

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.

Muetze1 31. Okt 2007 20:15

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
 
Hauptsache es funktioniert...

Popov 31. Okt 2007 20:34

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.

Muetze1 31. Okt 2007 20:49

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit
 
Zitat:

Zitat von Popov
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.

TMenuItem bietet eine öffentliche Methode namens Delphi-Referenz durchsuchenGetImageList.

Popov 31. Okt 2007 21:27

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:
  with TMenuItem(Sender), ACanvas do
  begin
    ...

    TPopupMenu(GetParentComponent).Images.GetIcon(ImageIndex, Ico);
    Draw(x, y, Ico);
Aber danke für den Tipp.


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