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;