![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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. Надо бы исходники посмотреть, чтобы понять что там происходит, но сейчас нет их под рукой.