Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];

Вниз

Можно ли изменить цвет отдельной строчки в 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 вся ветка

Форум: "KOL";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.047 c
15-1195058193
VmR
2007-11-14 19:36
2007.12.16
По какому принципу изменяют версию программы


6-1175800832
malyar
2007-04-05 23:20
2007.12.16
склейка пакетов в сокете


15-1194983910
Kostafey
2007-11-13 22:58
2007.12.16
Обновление ряда таблиц БД из другой БД СУБД SQL Server 2005


2-1195841377
Neo
2007-11-23 21:09
2007.12.16
как проверить - сущ-ет ли БД, с которой связывается программа?


3-1187018188
kirik
2007-08-13 19:16
2007.12.16
работа с FoxPro базами (dbf) через BDE. Проблема структуры.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский