![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли изменить цвет отдельной строчки в TKOLListView ?
vpbar © (2007-06-07 15:29:00)Уважаемые. Помогите пожалуйста. Возникла проблема. Нужно каждой строчке ListView-а свой цвет задать. А брать на себя полностью отрисовку не хочется. Отсюда вопрос:
Можно ли изменить цвет отдельной строчки в TKOLListView, не отрисовывая полностью все через DrawItem?
Vladimir Kladov (2007-06-10 17:16:00) [1]вспоминая "свой" адрес, сбился с мысли и задумался... не заметил, как суффикс перепутал.
Проще своим кодом нарисовать, тем более пример есть. И не устанавливать шрифт.
VPBar (2007-06-10 14:10:00) [2]>> homm
Неважно, я незнаю какой из них официальней, поэтому и там и там бываю одинаково часто.
homm (2007-06-10 13:56:00) [3]> kolmck.ru Пора бы уже усвоить - это "мой" официальный сайт.
Владимир хотел сказать http://kolmck. net;)
VPBar (2007-06-10 12:42:00) [4]хм. Вообщем, такое поведение не связано с высотой строчки и не есть особенность KOL. ListView из VCL ведет себя в данном случае также.
Если кто скаже что я делал неправильно и подскажет как разным строчкам установить разный шрифт, буду благодарен.
Если нет то все равно всем спасибо. В принципе достаточно только разных цветов.
VPBar (2007-06-10 12:10:00) [5]Жаль нельзя редактировать свой пост.
Вообщем установка размера LVItemHeight не помогает.
Все равно постоянно перерисовывается, если для разных строчек разный шрифт.
VPBar (2007-06-10 12:08:00) [6]Я там регулярно бываю, но этого не нашел ни там 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 больше чем максимальная высота шрифта.
Vladimir Kladov (2007-06-10 11:49:00) [7]kolmck.ru Пора бы уже усвоить - это "мой" официальный сайт.
VPBar (2007-06-10 11:25:00) [8]>> Vladimir Kladov
А где DemoLVCustomDraw новый скачать?
Vladimir Kladov (2007-06-10 11:20:00) [9]И правда, заработало - через NM_CUSTOMDRAW, просто вернул для хидера CDRF_DODEFAULT. Еще засомневался, не отменилась ли остальная часть отрисовки. Нет, все работает. DemoLVCustomDraw обновил.
Странно, однако, что по умолчанию Windows не рисует хидер вообще.
Vladimir Kladov (2007-06-10 09:23:00) [10]То есть используется OnDrawItem. Насколько я помню, хидеры колонок при этом рисуются сами. Мне хотелось бы использовать OnLVCustomDraw и при этом заставить Windows так же рисовать самой заголовки колонок. Мне удалось приемлемым способом рисовать в таком варианте сами ячейки, или менять шрифт/цвет или не менять, и отдельные элементы пропускать, отдавая стандартному обработчику. Но при этом заголовки не рисуются. Если перенаправить стандартному обработчику при индексе -1, который вроде бы соответствует строке заголовка, то событие для всех прочих ячеек уже не срабатывает, и все рисование делается автоматически. А если не перенаправлять, то для ячеек событие срабатывает, а для заголовка - все равно не получается. Я еще посмотрю на это дело, может быть, достаточно будет обрабатывать как раз WM_NOTIFY с сообщениями для хидера.
Dimaxx (2007-06-09 23:15:00) [11]Рисовал так. Строчки заливались через одну 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-09 18:50:00) [12]А в чем пробовал?
На самом деле, интересует именно такой варинт, чтобы заголовки самому не отрисовывать, а чтобы windows их сама рисовала. При том, чтобы строки/ячейки рисовались либо своим кодом, либо с модификацией шрифта, илбо - для каких-то строк - опять же по default.
mdw (2007-06-09 17:55:00) [13]
> Мне так и не получилось сделать для режима lvsDetail (не
> lvsDetailNoHeader), чтобы заголовки рисовались хоть как-
> нибудь. Получилось, что custom-отрисовка работает "красиво"
> только когда нет заголовков колонок.
Не понял, не получается отрисовать заголовок или сами строчки? Если заголовок, то с этим разобрался и он нормально рисуется (делал отрисовку для сласса SysHeader32 в стиле GRushControl), а в ListView он и используется. Ставить обработчик у парента заголовка(т.е. ListView) на WM_NOTIFY-NM_CUSTOMDRAW и рисовать. Правда это в теории, на практике не пробовал именно для ListView.
Vladimir Kladov (2007-06-09 17:06:00) [14]Если разберетесь в OnCustomDraw... - там можно подставить только цвет шрифта, остальное поручить отрисовщику по умолчанию. Разобраться сложно. Мне так и не
получилось сделать для режима lvsDetail (не lvsDetailNoHeader), чтобы заголовки рисовались хоть как-нибудь. Получилось, что custom-отрисовка работает "красиво" только
когда нет заголовков колонок.
Если кто знает рецепт побороться с заголовками, дайте пример в эту ветку. Что-то у меня подозрение, что надо субклассировать header-контрол для этого, что весьма
громоздко получается.
Что за напасть, гружу ветку в проводник, а она по три раза перезагружается, начинаешь отвечать - бац, и снова чистое поле ввода! А в предыдущий раз еще и другая ветка загрузилась...