Einzelnen Beitrag anzeigen

Solutor

Registriert seit: 24. Dez 2017
15 Beiträge
 
Delphi XE2 Enterprise
 
#2

AW: ListBox OnMouseOver Item-Farbe

  Alt 2. Jan 2018, 19:09
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;
  Mit Zitat antworten Zitat