![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TListView, OwnerDraw, артефакты при ресайзе колонок [D5, XP]
RWolf © (2007-07-08 03:33:00)скорее всего баян, но вот не соображу, в чем дело, и поиск в сети результатов не дает.
собсно, рисую сабж стиля vsReport из 2 колонок, обрабатывая OnDrawItem таким вот образом:
var
bounds,r:TRect;
fg,bg:TColor;
...
bounds:=item.DisplayRect(drBounds);
with sender.Canvas do begin
//закрашиваем строку
brush.Color:=bg;
FillRect(bounds);
//рисуем 1-ю колонку
font.Color:=fg;
r:=bounds;
r.Right:=r.Left+lv.Columns[0].Width;
TextRect(bounds,r.Left+2,r.Top,Item.Caption);
//рисуем 2-ю колонку
font.Color:=fg;
r.Left:=r.Left+lv.Columns[0].Width;
r.Right:=bounds.Right;
TextRect(bounds,r.Left+2,r.Top,Item.SubItems[0]);
if odFocused in state then DrawFocusRect(bounds);
end;
меняю ширину 1-й колонки и получаю на экране две копии 2-й колонки на старом и на новом местах.
Что поменять в коде для корректной отрисовки?
RWolf (2007-07-08 20:11:00) [1]
> Что серым становиться - фон? или цвет шрифта?
шрифт в обеих колонках отрисовывается серым цветом.
{RASkov} (2007-07-08 19:30:00) [2]> [3] RWolf © (08.07.07 14:29)
> Две последние колонки закрашиваются серым цветом. Глюк VCL?
Canvas она одна для всего компонента и соответственно перья и кисти тоже....
Отсюда - возможно ты орисовал рект с переопределенными цветами пера и кисти и не вернул назад, последующая отрисовка канвы идет с последними определенными цветами...
А вообще не понятно
> lv.Canvas.Font.Color := clGrayText;
и
> колонки закрашиваются серым цветом
Что серым становиться - фон? или цвет шрифта?
RWolf (2007-07-08 14:29:00) [3]Отказался от собственной прорисовки; мне, в принципе, нужна только подсветка колонок. Наблюдаю очередные грабли.
ListView, три колонки, стиль vsReport, OwnerDraw=False.
procedure TfrmMain.lvCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
lv.Canvas.Font.Color := clWindowText;
end;
procedure TfrmMain.lvCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
begin
case SubItem of
0: Exit; //первая колонка уже обработана
1: lv.Canvas.Font.Color := clGrayText; //закрасить среднюю колонку серым
else lv.Canvas.Font.Color := clWindowText; //остальные - черным
end;
end;
Две последние колонки закрашиваются серым цветом. Глюк VCL?
Германн (2007-07-08 03:56:00) [4]
>
> меняю ширину 1-й колонки и получаю на экране две копии 2-
> й колонки на старом и на новом местах.
> Что поменять в коде для корректной отрисовки?
>
Событие OnDrawItem!
Отрисовывай в нём только то, что ему принадлежит. И никаких колонок!
RWolf (2007-07-08 03:38:00) [5]прошу прощения, ошибся немного. Привожу полный текст обраотчика:
procedure TForm1.lvDrawItem(Sender: TCustomListView;
Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var
bounds,r:TRect;
fg,bg:TColor;
begin
bg:=clWindow;
fg:=clWindowText;
if odSelected in state then begin
bg:=clHighlight;
fg:=clHighlightText;
end;
bounds:=Item.DisplayRect(drBounds);
with sender.Canvas do begin
//закрашиваем строку
brush.Color:=bg;
FillRect(bounds);
//рисуем 1-ю колонку
font.Color:=fg;
r:=bounds;
r.Right:=r.Left+lv.Columns[0].Width;
TextRect(r, r.Left+2, r.Top, Item.Caption);
//рисуем 2-ю колонку
font.Color:=fg;
r.Left :=r.Left+lv.Columns[0].Width;
r.Right:=bounds.Right;
TextRect(r, r.Left+2, r.Top, Item.SubItems[0]);
if odFocused in state then DrawFocusRect(bounds);
end;
end;