Hallo WP, danke dir erstmal dafür. Sieht gut aus.- leider kann ich die Demo nicht sehen.- wo soll die sein? Grüßewp_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:Das ganze gibt es als kleines Demo im Anhang.
- 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;
Button Gestaltung
-
- Beiträge: 179
- Registriert: Mo 13. Jan 2025, 12:11
Re: Button Gestaltung
Re: Button Gestaltung
Mist - vergessen... Ist nun im ursprünglichen Beitrag angehängt.
-
- Beiträge: 179
- Registriert: Mo 13. Jan 2025, 12:11
Re: Button Gestaltung
Cool.- Danke dir.wp_xyz hat geschrieben: Di 22. Apr 2025, 20:10 Mist - vergessen... Ist nun im ursprünglichen Beitrag angehängt.
