Форум: "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