![]() |
ListBox OnMouseOver Item-Farbe
Wie bekommt man es hin, dass wenn man mit der Maus über ein Listboxitem fährt, sich die Farbe ändert?
Ich möchte eine sehr dezente Farbe nutzen, ein leichtes Grau. Ratet ihr davon grundsätzlich ab oder gehört das schon zu Benutzerfreundlichkeit? So weit bin ich, komme aber nicht weiter
Delphi-Quellcode:
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var Index: Integer; Point: TPoint; CCanvas: TCanvas; begin Point.X := X; Point.Y := Y; Index := TListBox(Sender).ItemAtPos(Point, True); if Index > -1 then begin CCanvas := TListBox(Sender).Canvas; CCanvas.Brush.Color := clRed; end; end; |
AW: ListBox OnMouseOver Item-Farbe
Also mal "quick and dirty":
Man kommt nicht ums selbst Zeichnen in der Behandlungsroutine Drawitem der Listbox herum. Damit das funktioniert, muss man die Eigenschaft Style der Listbox auf LbOwnerDrawFixed setzen. Ich hab anstelle einer globalen Variable die Tag-Eigenschaft der Listbox als Zwischenspeicher verwendet. Die Farben muss man wie ich es hier gemacht habe, dann selber setzen.
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin With Control as Tlistbox do begin with canvas do begin brush.Color:=clwhite;//Standardfarfbe der Listbox Font.Color:=clblack;//Standardfarbe des Textes If OdSelected in State then //Wenn Eintrag markiert ist begin Brush.Color:=clblue; Font.Color:=clwhite; end; if Tag=Index then //Wenn sich der Cursor in der hier zu zeichneten Zeile befindet. begin Brush.Color:=clred; Font.Color:=clwhite; end; fillrect(rect);//Eintrag einfärben Textout(rect.left,rect.Top,Items[index]);//Text ausgeben end; //Trick um das Focus Rechteck auszublenden if (odSelected in State) then begin Canvas.DrawFocusRect(Rect); if not (odFocused in State) then Canvas.DrawFocusRect(Rect); end; end; end; procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); Var z:Integer; begin z:=ListBox1.ItemAtPos(TPoint.Create( X, Y ),True); if z<>Listbox1.Tag then begin Listbox1.Items.BeginUpdate; ListBox1.Tag:=z; Listbox1.Invalidate; Listbox1.Items.EndUpdate; end; end; |
AW: ListBox OnMouseOver Item-Farbe
Zitat:
Und wenn sie dann nicht zusätzlich auch "focused" ist, machst du nochmal DrawFocusRect. Das passiert also folgendes Wenn eine Zeile "selected" und "focused" ist, dann zeichnest du das FocusRect und die ListBox nimmt es mit ihrem "internen DrawFocusRect wieder weg. Wenn eine Zeile "selected" aber nicht "focused" ist dann zeichnest du das FocusRect, nimmst es wieder weg und die Listbox macht in dem Fall gar nichts. Ist irgendwie doppelt gemoppelt. Ein einfaches
Delphi-Quellcode:
ist völlig ausreichend, denn eine Zeile kann nur dann "focused" sein wenn sie auch "selected" ist.
if odFocused in State then Canvas.DrawFocusRect(Rect);
|
AW: ListBox OnMouseOver Item-Farbe
Danke Amateurprofi,
da hab ich nicht zu Ende gedacht. Deine Lösung ist es besser und hat sicher weniger Seiteneffekte, von der Performance ganz zu schweigen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz