Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - TToolbar (Menu-Property): Selbst mit Hover-Effekt zeichnen?
Experience1986 - Mi 24.01.07 11:31
Titel: TToolbar (Menu-Property): Selbst mit Hover-Effekt zeichnen?
Hallo erstmal,
ich habe eine TToolBar die automatisiert Buttons darstellt, welche von einem TMainMenu stammen.
Nun möchte ich die TToolBar nach eigenen wünschen zeichnen, mit OnCustomDraw und OnCustomDrawButton.
Das funktioniert soweit auch recht problemlos, allerdings hätte ich gerne einen Hover-Effekt beim jeweiligen Button, wenn man mit der Maus über diesen geht, ähnlich einen Office 2002 XP Menü.
Das einzige Problem bei der Umsetzung ist, dass ich die geeignete Bedingung, welche mir sagt ob die Mouse über dem Button ist, nicht finden kann.
Ich habe schon alle Werte des State-Parameters überprüft, allerdings finde ich da nicht der gleichen, auch der Parameter Button scheint die Information nicht bereitzustellen.
Wie lautet also nun die Bedingung, um den "Hover-Status" eines einzelnen Buttons auf einer TToolBar abzufragen, oder muss ich mir die Koordinaten über den Umweg "OnMouseMove" merken und dann bei OnCustomDraw verarbeiten?
Experience1986 - Mi 24.01.07 11:58
Richtig, nur programmier ich mir das selbst...
Ich brauch nur die entsprechende Bedingung mit der ich abfragen kann ob die maus gerade über einem button ist, so dann ich diesen button dann anders darstellen kann.
nivosta - Mi 24.01.07 12:04
Ist das eine komplett eigene Toolbar oder baust du auf bestehende Komponenten auf?
Wenns eigen ist kannst du die Windows Message dafür abfangen und die verarbeiten nach deiner eigenen
Verarbeitung leitest du die Message dann weitere so das die object vorfahren damit arbeiten können.
Leider kann ich dir nicht genau sagen wie die Messages heißen sind abe in der Delphi/WinApi hilfe beschrieben.
//Edit: Ansonsten kannst du auch TSpeedButton nehmen die haben schon fast so einen effeckt leider läst sich
da nur schwer die Farbe ändern wenn das auch noch sein sollte.
Experience1986 - Mi 24.01.07 12:06
Ich hab einfach ne standard TToolbar die ich mit OnCustomCraw neu zeiche, daher die Darstellung änder:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| t:TToolbar procedure TForm1.tCustomDraw(Sender: TToolBar; const ARect: TRect; var DefaultDraw: Boolean); begin t.Canvas.StretchDraw(ARect, Image1.Picture.Graphic); end; |
nivosta - Mi 24.01.07 12:10
ja aber dann hast du ja nur das Toolbar object und die Buttons sind als proteced in der Toolbar also ohne direkten Zugriff. Nur das änder der Toolbar nutzt dir da nichts du must ja an die einzelnen Toolbuttons ran.
Experience1986 - Mi 24.01.07 12:20
Ja, kenn ich schon.. allerdings kann ich in deren Quellcode die gesuchte Bedingung auch nicht ausfindig machen...
Zudem will ich XPMenu nicht einfach anwenden sondern ich will es selbst programmieren.
Außerdem stellt XPMenu es nicht so da wie ich es gern hätte.
Experience1986 - Mi 24.01.07 16:17
Also noch mal, ich brauche nur eine Variable oder Eigenschaft mit der prüfen kann, ob der Mauszeiger über einen, durch die TMainMenü generierten, Button zeigt.
Das ganze soll dann so aussehen:
Hier habe ich meinen bisherigen, noch mageren Code:
http://p2p.lothargeisinger.de/TToolBar.rar
Und hier die relvante Stelle:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| procedure TForm1.tCustomDrawButton(Sender: TToolBar; Button: TToolButton; State: TCustomDrawState; var DefaultDraw: Boolean); begin
DefaultDraw:=false;
with t do begin
Canvas.Brush.Style:=bsClear; Canvas.TextOut(Button.Left+10, 4, Button.Caption); end; end; |
Der auskommentierte Block ist aus der angesprochenen TXPMenu komponente, welche frei im Internet erhältlist ist. Ich war der Meinung das dies die Codestelle der Komponente sein müsste, die für meinen gesuchten Effekt zuständig sein müsste, allerdings ist dem nicht so.
Meine Frage nochmal: Wie heist die Eigenschaft / Bedingung die ich abfragen muss, um bei einem Button darauf zu reagieren wenn die Maus darüber ist (damit dann der Hintergrund geändert wird)?
(In etwa so: if Button.MouseOver then ...)
Und nein, ich will nicht TXPMenu verwenden. Zum einen will ich das selbst programmieren, zum anderen kann TXPMenu nicht das darstellen was ich haben will.
Kommerzielle Komponenten kommen für mich auch nicht in Frage, da ich diese Lösung für eine Oberfläche meiner Freeware
AutostartAdministrator [
http://www.lothargeisinger.de/products/index.php?mode=information&application=2] einsetzen möchte.
Ich hoffe um weitere Antworten und bedanke mich schon mal im voraus.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!