Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизTListView, OwnerDraw, артефакты при ресайзе колонок Найти похожие ветки
← →
RWolf © (2007-07-08 03:33) [0]скорее всего баян, но вот не соображу, в чем дело, и поиск в сети результатов не дает.
собсно, рисую сабж стиля 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 03:38) [1]прошу прощения, ошибся немного. Привожу полный текст обраотчика:
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;
← →
Германн © (2007-07-08 03:56) [2]
>
> меняю ширину 1-й колонки и получаю на экране две копии 2-
> й колонки на старом и на новом местах.
> Что поменять в коде для корректной отрисовки?
>
Событие OnDrawItem!
Отрисовывай в нём только то, что ему принадлежит. И никаких колонок!
← →
RWolf © (2007-07-08 14:29) [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?
← →
{RASkov} © (2007-07-08 19:30) [4]> [3] RWolf © (08.07.07 14:29)
> Две последние колонки закрашиваются серым цветом. Глюк VCL?
Canvas она одна для всего компонента и соответственно перья и кисти тоже....
Отсюда - возможно ты орисовал рект с переопределенными цветами пера и кисти и не вернул назад, последующая отрисовка канвы идет с последними определенными цветами...
А вообще не понятно
> lv.Canvas.Font.Color := clGrayText;
и
> колонки закрашиваются серым цветом
Что серым становиться - фон? или цвет шрифта?
← →
RWolf © (2007-07-08 20:11) [5]
> Что серым становиться - фон? или цвет шрифта?
шрифт в обеих колонках отрисовывается серым цветом.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.061 c