Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1184140854
Tonich
2007-07-11 12:00
2007.08.05
SQL запрос


15-1183655714
@!!ex
2007-07-05 21:15
2007.08.05
НЕ смотрится DVD.


2-1183789996
Riply
2007-07-07 10:33
2007.08.05
Длинное и короткое имя файла в одном флаконе. :)


1-1180422112
lexicss
2007-05-29 11:01
2007.08.05
Вызов функции по таймеру


15-1183719967
nord489
2007-07-06 15:06
2007.08.05
Работа с 3D





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский