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

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

ListView.Canvas [D7, XP]


Yegorchic ©   (2006-07-04 20:47:00) 

Здравствуйте! Объясните пожалуйста, почему когда я что-то рисую на ListView'е, то у меня выделяются жирным Item'ы разные и по-разному. Вот например:

http://www.harmony-school.fatal.ru/images/form1.gif(7.9kb)

Так же, хотелось бы узнать, как правильно использовать ListView.Canvas.Brush.Color, т.к. когда я хочу просто нрисовать прямоугольник закрышенный, то у меня закрашевается весь Item (на картинке тоже показано). Почему?
На время рисования этого прямоугольника я ставлю ListView.Canvas.Brush.Color:=clRed, а сразу после clWhite. Но почему у меня весь Item закрашевается?

Рисую я во время выполнения event'а CustomDrawSubItem, сообственно, на нужном Item'е.

P.S: На картике изображена попытка реализовать свой ProgressBar на Item'е ListView. Всё получилось, кроме закрашевания области нужной...


Yegorchic   (2006-07-05 13:02:00) [1]


> ListView_GetSubItemRect


А что это такое вообще?

И как быть с
> Yegorchic ©   (05.07.06 00:27) [5]


Жуков Олег   (2006-07-05 11:05:00) [2]

Сорри, опечатка вкралась.
Вместо ListView_GetSubItemRect(ListView1.Handle, Item.Inde nt>, SubItem, LVIR_BOUNDS, @Rect)читать ListView_GetSubItemRect(ListView1.Handle, Item.Inde х, SubItem, LVIR_BOUNDS, @Rect)


Yegorchic   (2006-07-05 00:27:00) [3]

Ай, всё-таки ещё вопрос есть:

http://www.harmony-school.fatal.ru/images/form1_.gif(7.8kb)

Почему некоторые Item'ы выделяются жирным?


Yegorchic   (2006-07-05 00:14:00) [4]

Всё! Я разобрался с Вашей помощью! Спасибо!
Всё работает!

И на Refresh в самом деле всё нормально реагирует. Это я, значит, с ListView.Repaint перепутал!

Спасибо ещё раз!

Только у меня вопрос: а что это за процедура
       ListView_GetSubItemRect(ListView1.Handle, Item.Indent, SubItem, LVIR_BOUNDS, @Rect);?


Жуков Олег   (2006-07-04 23:42:00) [5]


> Просто тогда будет опять происходить событие CustomDrawSubItem,
> которое повлечёт за собой ListView.Canvas.Refresh и так далее...


- не будет.


> а время рисования этого прямоугольника я ставлю ListView.
> Canvas.Brush.Color:=clRed, а сразу после clWhite. Но почему
> у меня весь Item закрашевается?


Попробовал. Ошибка не воспроизводится:

 ListView_GetSubItemRect(ListView1.Handle, Item.Indent, SubItem, LVIR_BOUNDS, @Rect);
 ListView1.Canvas.Brush.Color := clRed;
 ListView1.Canvas.FillRect(Rect);
 ListView1.Canvas.Brush.Color := clGreen;
 Rect.Right := (Rect.Right + Rect.Left) div 2;
 ListView1.Canvas.FillRect(Rect);
 ListView1.Canvas.Brush.Color := ListView1.Color;

Этот код рисует на SubItem красный прямоугольник, потом половину его закрашивает зелёным, и потом восстанавливает Canvas-у нормальный цвет.
Если убрать последнюю строчку, то получается примерно как у тебя.


Yegorchic   (2006-07-04 23:17:00) [6]


> Помогает после ListView.Canvas.Brush.Color:= ... сделать
> ListView.Canvas.Refresh.


А это опасно :-) Просто тогда будет опять происходить событие CustomDrawSubItem, которое повлечёт за собой ListView.Canvas.Refresh и так далее... т.е. будет ежемилесекундное обновление  ListView. Я так уже пробовал. Т.е. не получается так...


Жуков Олег   (2006-07-04 21:48:00) [7]

Помогает после ListView.Canvas.Brush.Color:= ... сделать ListView.Canvas.Refresh.
(А так же после изменения других свойств Canvas.Brush...., Canvas.Pen..., Canvas.Font...). Почему - не знаю, такое поведение наблюдал только у TreeView и ListView. Надо бы исходники посмотреть, чтобы понять что там происходит, но сейчас нет их под рукой.


Наверх

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