Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.16;
Скачать: CL | DM;

Вниз

Можно ли изменить цвет отдельной строчки в TKOLListView ?   Найти похожие ветки 

 
vpbar   (2007-06-07 15:29) [0]

Уважаемые. Помогите пожалуйста. Возникла проблема. Нужно каждой строчке ListView-а свой цвет задать. А брать на себя полностью отрисовку не хочется. Отсюда вопрос:
Можно ли изменить цвет отдельной строчки в TKOLListView, не отрисовывая полностью все через DrawItem?


 
Vladimir Kladov   (2007-06-09 17:06) [1]

Если разберетесь в OnCustomDraw... - там можно подставить только цвет шрифта, остальное поручить отрисовщику по умолчанию. Разобраться сложно. Мне так и не
получилось сделать для режима lvsDetail (не lvsDetailNoHeader), чтобы заголовки рисовались хоть как-нибудь. Получилось, что custom-отрисовка работает "красиво" только
когда нет заголовков колонок.

Если кто знает рецепт побороться с заголовками, дайте пример в эту ветку. Что-то у меня подозрение, что надо субклассировать header-контрол для этого, что весьма
громоздко получается.

Что за напасть, гружу ветку в проводник, а она по три раза перезагружается, начинаешь отвечать - бац, и снова чистое поле ввода! А в предыдущий раз еще и другая ветка загрузилась...


 
mdw ©   (2007-06-09 17:55) [2]


> Мне так и не получилось сделать для режима lvsDetail (не
> lvsDetailNoHeader), чтобы заголовки рисовались хоть как-
> нибудь. Получилось, что custom-отрисовка работает "красиво"
> только когда нет заголовков колонок.

Не понял, не получается отрисовать заголовок или сами строчки? Если заголовок, то с этим разобрался и он нормально рисуется (делал отрисовку для сласса SysHeader32 в стиле GRushControl), а в ListView он и используется. Ставить обработчик у парента заголовка(т.е. ListView) на WM_NOTIFY-NM_CUSTOMDRAW и рисовать. Правда это в теории, на практике не пробовал именно для ListView.


 
Vladimir Kladov   (2007-06-09 18:50) [3]

А в чем пробовал?

На самом деле, интересует именно такой варинт, чтобы заголовки самому не отрисовывать, а чтобы windows их сама рисовала. При том, чтобы строки/ячейки рисовались либо своим кодом, либо с модификацией шрифта, илбо - для каких-то строк - опять же по default.


 
Dimaxx ©   (2007-06-09 23:15) [4]

Рисовал так. Строчки заливались через одну 2 цетами, строки тоже полностью отрисовывал ручками. А заголовки и не трогал - как были, так и остались.

function TForm1.DropDrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
                            ItemIdx: Integer; DrawAction: TDrawAction;
                            ItemState: TDrawState): Boolean;
var M2: TMyItem;
   CC: TColor;
   R: TRect;
begin
 if odsSelected in ItemState then CC:=clHighLight else
   begin
     if (ItemIdx mod 2)=0 then CC:=C1 else CC:=C2;
   end;
 PControl(Sender).Canvas.Brush.Color:=CC;
 PControl(Sender).Canvas.FillRect(Rect);
 if odsSelected in ItemState then PControl(Sender).Canvas.DrawFocusRect(Rect);
 // Рисуем иконку
 M2:=GetItem(PControl(Sender).LVItemImageIndex[ItemIdx]);
 BMP.LoadFromFile(Work+M2.Icon);
 BMP.Draw(DC,1,succ(Rect.Top));
 // Рисуем название
 R.Top:=Rect.Top;
 R.Left:=PControl(Sender).LVColWidth[0]+2;
 R.Bottom:=Rect.Bottom;
 R.Right:=R.Left+PControl(Sender).LVColWidth[1]-2;
 PControl(Sender).Canvas.DrawText(PControl(Sender).LVItems[ItemIdx,1],R,DT_LEFT+DT_SINGLELINE+DT_VCENTER);
 // Рисуем параметр 1
 R.Left:=PControl(Sender).LVColWidth[0]+PControl(Sender).LVColWidth[1]+2;
 R.Right:=R.Left+PControl(Sender).LVColWidth[2]-2;
 PControl(Sender).Canvas.DrawText(PControl(Sender).LVItems[ItemIdx,2],R,DT_LEFT+DT_SINGLELINE+DT_VCENTER);
 // Рисуем параметр 2
 R.Left:=PControl(Sender).LVColWidth[0]+PControl(Sender).LVColWidth[1]+PControl(Sender).LVColWidth[2]+2;
 R.Right:=R.Left+PControl(Sender).LVColWidth[3]-2;
 PControl(Sender).Canvas.DrawText(PControl(Sender).LVItems[ItemIdx,3],R,DT_LEFT+DT_SINGLELINE+DT_VCENTER);
 Result:=True;
end;


 
Vladimir Kladov   (2007-06-10 09:23) [5]

То есть используется OnDrawItem. Насколько я помню, хидеры колонок при этом рисуются сами. Мне хотелось бы использовать OnLVCustomDraw и при этом заставить Windows так же рисовать самой заголовки колонок. Мне удалось приемлемым способом рисовать в таком варианте сами ячейки, или менять шрифт/цвет или не менять, и отдельные элементы пропускать, отдавая стандартному обработчику. Но при этом заголовки не рисуются. Если перенаправить стандартному обработчику при индексе -1, который вроде бы соответствует строке заголовка, то событие для всех прочих ячеек уже не срабатывает, и все рисование делается автоматически. А если не перенаправлять, то для ячеек событие срабатывает, а для заголовка - все равно не получается. Я еще посмотрю на это дело, может быть, достаточно будет обрабатывать как раз WM_NOTIFY с сообщениями для хидера.


 
Vladimir Kladov   (2007-06-10 11:20) [6]

И правда, заработало - через NM_CUSTOMDRAW, просто вернул для хидера CDRF_DODEFAULT. Еще засомневался, не отменилась ли остальная часть отрисовки. Нет, все работает. DemoLVCustomDraw обновил.

Странно, однако, что по умолчанию Windows не рисует хидер вообще.


 
VPBar   (2007-06-10 11:25) [7]

>> Vladimir Kladov
А где DemoLVCustomDraw новый скачать?


 
Vladimir Kladov   (2007-06-10 11:49) [8]

kolmck.ru Пора бы уже усвоить - это "мой" официальный сайт.


 
VPBar   (2007-06-10 12:08) [9]

Я там регулярно бываю, но этого не нашел ни там http://www.kolnmck.ru/files3.shtml , ни тут http://kolmck.net/rindex.htm
Кстати ответ на свой вопрос я нашел. Спасибо за указание на onLVCustomDraw и борланду за TCustomListView.CNNotify.
Правда проблем с заголовками у  меня не возникло. Вот код onLVCustomDraw:
begin
 result := CDRF_DODEFAULT;
 if (Stage and CDDS_PREPAINT) <> 0 then
 begin
    lVMaster.Font.FontStyle := [fsBold];
   if ItemIdx mod 2 = 0 then begin
     TextColor := clRed   ;
   end else begin
     TextColor := clBlue;
   end;
   Result := Result or CDRF_NEWFONT or CDRF_NOTIFYITEMDRAW;
 end;
end;
Но если  указывать разный шрифт для итемов
...
   if ItemIdx mod 2 = 0 then begin
     TextColor := clRed   ;
     lVMaster.Font.FontStyle := [fsBold];
   end else begin
     TextColor := clBlue;
     lVMaster.Font.FontStyle := [];
   end;
..........
То ListView начинает постоянно перерисовываться. Видимо это из за того что каждый раз устанавливается новая высота строчки. Поэтому высоту строки надо установить через LVItemHeight больше чем максимальная высота шрифта.


 
VPBar   (2007-06-10 12:10) [10]

Жаль нельзя редактировать свой пост.
Вообщем установка размера LVItemHeight не помогает.
Все равно постоянно перерисовывается, если для разных строчек разный шрифт.


 
VPBar   (2007-06-10 12:42) [11]

хм. Вообщем, такое поведение не связано с высотой строчки и не есть особенность KOL. ListView из VCL ведет себя в данном случае также.
Если кто скаже что я делал неправильно и подскажет как разным строчкам установить разный шрифт, буду благодарен.
Если нет то все равно всем спасибо. В принципе достаточно только разных цветов.


 
homm ©   (2007-06-10 13:56) [12]

> kolmck.ru Пора бы уже усвоить - это "мой" официальный сайт.

Владимир хотел сказать http://kolmck.net ;)


 
VPBar   (2007-06-10 14:10) [13]

>> homm
Неважно,  я незнаю какой из них официальней, поэтому и там и там бываю одинаково часто.


 
Vladimir Kladov   (2007-06-10 17:16) [14]

вспоминая "свой" адрес, сбился с мысли и задумался... не заметил, как суффикс перепутал.

Проще своим кодом нарисовать, тем более пример есть. И не устанавливать шрифт.



Страницы: 1 вся ветка

Текущий архив: 2007.12.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
15-1195131674
Александр Павлов
2007-11-15 16:01
2007.12.16
Орешник


15-1195131734
Ega23
2007-11-15 16:02
2007.12.16
Так всё-таки: как канонически правильно передавать объекты


2-1194980331
BD
2007-11-13 21:58
2007.12.16
Не считывается инфа из реестра под другим пользователем


15-1195416112
Torry
2007-11-18 23:01
2007.12.16
www.torry.net - 11 лет


15-1195408382
Evanescence
2007-11-18 20:53
2007.12.16
Решение кубика-рубика