procedure TTest.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);begin With ( Control As TListBox ).Canvas DoBeginCase Index Of0:BeginFont.Color := clBlue;Brush.Color := clYellow;End;1:BeginFont.Color := clRed;Brush.Color := clLime;End;2:BeginFont.Color := clGreen;Brush.Color := clFuchsia;End;End;FillRect(Rect);TextOut(Rect.Left, Rect.Top, ( Control As TListBox ).Items[Index]);End;end; |
Вышеприведенный код устанавливает различный цвет у фона и текста в зависимости от номера строки, но он не работает с выделенными/выбранными строками (кстати, не забудьте установить значение свойства ListBox1.Style равным lbOwnerDrawFixed.)
procedure TListTest.ListBox1DrawItem( Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState ); Const HighLight = 'LINE'; Var TempLine, TempText, TempHigh: String;TempLeft, TempTop, TempStart: Integer;OldColor: TColor; begin with ( Control as TListBox ).Canvas dobeginFillRect( Rect );TempLeft := Rect.Left + 3;TempTop := Rect.Top + 1;TempLine := ( Control as TListBox ).Items[ Index ]; While TempLine > '' DoBeginTempStart := Pos( HighLight, AnsiUpperCase( TempLine ) ); If TempStart > 0 ThenBeginTempText := Copy( TempLine, 1, TempStart - 1 );TempHigh := Copy( TempLine, TempStart, Length( HighLight ) );Delete( TempLine, 1, TempStart + Length( HighLight ) - 1 );EndElseBeginTempText := TempLine;TempHigh := '';TempLine := '';End; If TempText > '' ThenBeginTextOut( TempLeft, TempTop, TempText );Inc( TempLeft, TextWidth( TempText ) );End; If TempHigh > '' ThenBeginOldColor := Font.Color;If odSelected In State ThenFont.Color := clYellowElseFont.Color := clBlue;TextOut( TempLeft, TempTop, TempHigh );Inc( TempLeft, TextWidth( TempHigh ) );Font.Color := OldColor;End;End;end;end; |
Это можно протестировать со следующими тремя строками:
'Строка номер один'
'Вторая строка'
'Это строчка номер три'
Есть несколько вещей, достойных упоминания:
Я использую параметр Control для приведения типов ( Control as TListBox ).Items[ Index ], что убедиться в том, что я использую данные ListBox, такой способ позволяет сделать общим данный обработчик события для нескольких компонентов TListBox, например, если у вас имеется пара ListBox на различных страницах TNoteBook.
OldColor и проверка параметра State позволяет быть уверенным, что выбранная строка содержит видимый цвет шрифта (множество видеодрайверов используют белый текст на синем фоне для выбранной строки).
Также я создаю небольшое свободное пространство вокруг текста - увеличиваю TListBox.ItemHeight и, соответственно, область вывода текста - TempLeft := Rect.Left + 3 и TempTop := Rect.Top + 1.
[000153]