Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо