Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизРаскраска строк в listview Найти похожие ветки
← →
denis24 (2004-09-09 10:09) [0]Как сделать правильно сабж?Стиль Report.
ondrawitem......
if TListView(sender).Column[3].Caption ="" then
Font.Color := clred;
FillRect(Rect);
TextOut(Rect.Left, Rect.Top,TListView(sender)........... );
← →
Black © (2004-09-09 11:33) [1]Это взято из FAQ"a Kuliba
Если разберёшся то поможет
У меня есть два примера процедур 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.
← →
denis24 (2004-09-09 12:17) [2]Это все хорошо.Но у меня listview в котором несколько колонок.
Я запутался с прорисовкой этих колонок.
Хочу так ,если в первой и во второй колонке значения совпадают то вся строка рисуется отдельным цветом..
Если делать так :
Sender.Canvas.TextOut(Rect.Left+23,Rect.Top+1,Item.Caption);
то рисуется только первая колонка
← →
AlexSV (2004-09-09 13:41) [3]> denis24
вместо OnDrawItem используй
OnCustomDrawItem ...
OnCustomDrawSubItem ...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.067 c