ListBox1 的 Style 属性改为 lbOwnerDrawVariable
在ListBox的OnDrawItem事件裡,根据item的值,改变Canvas属性
procedure TForm2.ListBox1DrawItem(Control: TWinControl; Index: integer;
Rect: TRect; State: TOwnerDrawState);
var
R: TRect;
begin
with ListBox1.Canvas do
begin
// 背景色
if State * [odSelected, odFocused] <> [] then
Brush.Color := clRed
else
Brush.Color := ListBox1.Color;
FillRect(Rect);
// 文字
if State * [odSelected, odFocused] <> [] then
Brush.Color := clHighlightText
else
Brush.Color := ListBox1.Font.Color;
R := Rect;
InflateRect(R, -4, 0);
SetBkMode(Handle, TRANSPARENT);
DrawText(Handle, ListBox1.Items[Index], -1, R, DT_SINGLELINE or DT_VCENTER);
// 如果有焦点,则再绘制一次焦点框,达到擦除的目的
if odFocused in State then
DrawFocusRect(Rect);
end;
end;
或者,
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin //字体用原来默认的颜色
if Odd(index) then //当items的index为奇数时的颜色
begin
listbox1.Canvas.Brush.Color:=clwindow;
ListBox1.Canvas.TextRect(Rect,rect.Left,Rect.Top,ListBox1.Items[index]);
end
else //当items的index为偶数时的颜色
begin
listbox1.Canvas.Brush.Color:=clinactivecaptiontext;
ListBox1.Canvas.TextRect(Rect,rect.Left,Rect.Top,ListBox1.Items[index]);
end;
if odSelected in state then //当选定时的颜色
begin
listbox1.Canvas.Brush.Color:=clhighlight;
ListBox1.Canvas.TextRect(Rect,rect.Left,Rect.Top,ListBox1.Items[index]);
end;
end;