Button Gestaltung

Für Fragen von Einsteigern und Programmieranfängern...
Andy Nightingale
Beiträge: 179
Registriert: Mo 13. Jan 2025, 12:11

Re: Button Gestaltung

Beitrag von Andy Nightingale »

wp_xyz hat geschrieben: Di 22. Apr 2025, 19:11 Wenn du beim SpeedButton die Eigenschaft Flat auf true setzt, wird der Standard-Rahmen nicht gezeichnet, nur beim Mouse-Over/Mouse-Down kommt ein Rahmen zur Hervorhebung.

Wenn du das nicht willst, musst du etwas programmieren (aber darum geht's ja!). Ein TImage würde ich nicht nehmen, das ist mir für diese Aufgabe zu schwergewichtig. Eine TPaintbox tut's auch.

Also:
  • Klicke eine TImageList aufs Formular. Setze Width und Height auf die Werte für die Größe deiner Button-Icons. Doppelklick auf der ImageList --> Füge die Bilder für die "Buttons" der Imagelist hinzu.
  • Klicke aufs Formular so viele TPaintbox-Instanzen wie du brauchst. Mache sie so groß, wie die Icons. Trage für jede Paintbox den ImageIndex des anzuzeigenden Bildes in der Allzweck-Eigenschaft "Tag" ein.
  • Um das Image anzuzeigen, markierst du alle Paintboxen und klickst auf den '...' neben der OnPaint-Eigenschaft. Dort trägst du folgenden Event-Handler ein, der für alle Paintboxen gelten soll - das ist der Code, mit dem sich jede Paintbox selbst zeichnet. Aus dem Sender-Parameter kannst du ableiten, welche Paintbox gerade gezeichnet wird - durch einen Type-Cast kannst du direkt auf die Paintbox zugreifen. Die Anzeige des Bildes erfolgt im wesentlichen durch Aufruf der Methode Draw der ImageList. der erste Parameter ist der canvas der Paintbox, auf dem gemalt werden soll, dann kommen X und Y der linken oberen Ecke des Bildes, sowie der ImageIndex, den du ja im Tag gespeichert hast. Der letzte Parameter schließlich ist ein TGraphicsDrawEffect-Wert, der bestimmt, wie das Bild je nach Mauszustand verändert werden soll: Normalzustand = gdeNormal, Maus über der Paintbox --> gdeHighlighted (= etwas heller als normal), Maus geklickt --> gdeShadowed (etwas dunkler als normal). Ob die Maus über der Paintbox ist, kann man durch Abfrage der Mouse.CursorPos rauskriegen, allerdings muss man diesen Wert von Bildschirm-Koordinaten auf die Paintbox herunterrechnen. Ob die linke Maustaste gedrückt ist, ist etwas umständlicher. Ich merke mir dafür im OnMouseDown-Ereignis den Tag-Wert der Paintbox und vergleiche diesen in OnPaint mit dem aktuellen Tag (siehe unten).

    Code: Alles auswählen

    procedure TForm1.PaintBox1Paint(Sender: TObject);
    var
      imgIndex: Integer;
      effect: TGraphicsDrawEffect;
      paintbox: TPaintbox;
      P: TPoint;
    begin
      paintbox := Sender as TPaintbox;
      imgIndex := paintbox.Tag;
      P := paintbox.ScreenToClient(Mouse.CursorPos);
      if PtInRect(paintbox.ClientRect, P) then
      begin
        if FMouseDownIndex = paintbox.Tag then   // Mouse down
          effect := gdeShadowed
        else
          effect := gdeHighlighted;
      end else
        effect := gdeNormal;
      ImageList1.Draw(paintbox.Canvas, 0, 0, imgIndex, effect);
    end;
  • Nun muss man noch die ganze Maussteuerung machen, also: wenn die Maus in eine Paintbox hinein oder herausbewegt wird, muss die Paintbox neu gezeichnet werden (Paintbox.Invalidate). Oder wenn die Maustaste gedrückt wird, muss man sich den Tag als Identifikation der Paintbox merken (FMouseDownIndex) und die Paintbox neu zeichnen. Genauso, wenn die Maustaste losgelassen wird - das setzen wir FMouseDownIndex auf einen Wert zurück, der sonst nirgendwo als Tag verwendet wird, am besten auf -1. Alle Paintboxen können sich dieselben Event-Handler teilen:

    Code: Alles auswählen

    procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift:
      TShiftState; X, Y: Integer);
    begin
      FMouseDownIndex := -1;
      (Sender as TPaintbox).Invalidate;
    end;
    
    procedure TForm1.PaintBox1MouseLeave(Sender: TObject);
    begin
      (Sender as TPaintbox).Invalidate;
    end;
    
    procedure TForm1.PaintBox1MouseEnter(Sender: TObject);
    begin
      (Sender as TPaintbox).Invalidate;
    end;
    
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift
      : TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        FMouseDownIndex := (Sender as TPaintbox).Tag;
        (Sender as TPaintbox).Invalidate;
      end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FMouseDownIndex := -1;
    end;
Das ganze gibt es als kleines Demo im Anhang.
Hallo WP, danke dir erstmal dafür. Sieht gut aus.- leider kann ich die Demo nicht sehen.- wo soll die sein? Grüße

wp_xyz
Beiträge: 5129
Registriert: Fr 8. Apr 2011, 09:01

Re: Button Gestaltung

Beitrag von wp_xyz »

Mist - vergessen... Ist nun im ursprünglichen Beitrag angehängt.

Andy Nightingale
Beiträge: 179
Registriert: Mo 13. Jan 2025, 12:11

Re: Button Gestaltung

Beitrag von Andy Nightingale »

wp_xyz hat geschrieben: Di 22. Apr 2025, 20:10 Mist - vergessen... Ist nun im ursprünglichen Beitrag angehängt.
Cool.- Danke dir. :)

Antworten