Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   ListBox OnMouseOver Item-Farbe (https://www.delphipraxis.net/194742-listbox-onmouseover-item-farbe.html)

LTE5 30. Dez 2017 18:54


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;

Solutor 2. Jan 2018 19:09

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;

Amateurprofi 3. Jan 2018 00:42

AW: ListBox OnMouseOver Item-Farbe
 
Zitat:

Zitat von Solutor (Beitrag 1390154)
;
Delphi-Quellcode:
      //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;
end;

Also, wenn die Zeile "selected" ist dann machst du ein DrawFocusRect.
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:
if odFocused in State then Canvas.DrawFocusRect(Rect);
ist völlig ausreichend, denn eine Zeile kann nur dann "focused" sein wenn sie auch "selected" ist.

Solutor 3. Jan 2018 11:25

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:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz