Autor Beitrag
Experience1986
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Mi 24.01.07 11:31 
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?
nivosta
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 35



BeitragVerfasst: Mi 24.01.07 11:54 
Hi,

meinst du so etws wie auf dieser Seite alphaskins.com/
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 35



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


Zuletzt bearbeitet von nivosta am Mi 24.01.07 12:07, insgesamt 1-mal bearbeitet
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Mi 24.01.07 12:06 
Ich hab einfach ne standard TToolbar die ich mit OnCustomCraw neu zeiche, daher die Darstellung änder:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
t:TToolbar //Wird vom Form instanziiert
procedure TForm1.tCustomDraw(Sender: TToolBar; const ARect: TRect;
  var DefaultDraw: Boolean);
begin
 t.Canvas.StretchDraw(ARect, Image1.Picture.Graphic);
end;
nivosta
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 35



BeitragVerfasst: 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.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 24.01.07 12:15 
Kennst du XPMenu schon? Du kannst damit genau angeben, welche Komponenten so dargestellt werden sollen...
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: 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:
user defined image

Hier habe ich meinen bisherigen, noch mageren Code:
p2p.lothargeisinger.de/TToolBar.rar

Und hier die relvante Stelle:
ausblenden 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:=bsSolid;

      // AUS TXPMENU
      if (cdsHot in State) then
      begin
        if (cdsChecked in State) or (Button.Down) or (cdsSelected in State) then
          Canvas.Brush.Color := clGreen
        else
          Canvas.brush.color := clRed;
      end;
      // ENDE: AUS TXPMENU
      Canvas.FillRect(Button.BoundsRect);}


      Canvas.Brush.Style:=bsClear;
      Canvas.TextOut(Button.Left+104, 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 einsetzen möchte.

Ich hoffe um weitere Antworten und bedanke mich schon mal im voraus.