AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Position des MenuItems Canvas bei zeichnen im Menu ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Position des MenuItems Canvas bei zeichnen im Menu ermitteln

Ein Thema von Popov · begonnen am 31. Okt 2007 · letzter Beitrag vom 31. Okt 2007
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

Position des MenuItems Canvas bei zeichnen im Menu ermitteln

  Alt 31. Okt 2007, 17:26
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 17:49
ARect enthält definitiv das richtige Rechteck zu dem Menuitem was du malen sollst. Woher kommt deine Meinung, dass ARect Müll ist?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 17:53
Weil es bei mir alles in die erste Zeile (Item) schreibt wenn ich das Reckt nicht anpasse.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 17:54
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?
Angehängte Dateien
Dateityp: zip ownerdraw_menu_749.zip (155,3 KB, 20x aufgerufen)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 18:18
Danke erstmal. Ich werde es gleich genauer studieren und melde mich gleich wieder.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 19:10
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 19:15
Hauptsache es funktioniert...
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 19:34
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 19:49
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#10

Re: Position des MenuItems Canvas bei zeichnen im Menu ermit

  Alt 31. Okt 2007, 20:27
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz