У меня есть два примера процедур OnDrawItem:
procedure TTest.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin With ( Control As TListBox ).Canvas Do Begin Case Index Of 0: Begin Font.Color := clBlue; Brush.Color := clYellow; End; 1: Begin Font.Color := clRed; Brush.Color := clLime; End; 2: Begin Font.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 do begin FillRect( Rect ); TempLeft := Rect.Left + 3; TempTop := Rect.Top + 1; TempLine := ( Control as TListBox ).Items[ Index ]; While TempLine > '' Do Begin TempStart := Pos( HighLight, AnsiUpperCase( TempLine ) ); If TempStart > 0 Then Begin TempText := Copy( TempLine, 1, TempStart - 1 ); TempHigh := Copy( TempLine, TempStart, Length( HighLight ) ); Delete( TempLine, 1, TempStart + Length( HighLight ) - 1 ); End Else Begin TempText := TempLine; TempHigh := ''; TempLine := ''; End; If TempText > '' Then Begin TextOut( TempLeft, TempTop, TempText ); Inc( TempLeft, TextWidth( TempText ) ); End; If TempHigh > '' Then Begin OldColor := Font.Color; If odSelected In State Then Font.Color := clYellow Else Font.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]