![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте.
Решил "разукрасить" ListView. Получилось закрасить четные строки одним, не четные другим цветом: Код:
WM_NOTIFY:
begin
if PNMHDR(lParam).hwndFrom = LV then
case PNMHDR(lParam).code of
NM_CUSTOMDRAW:
begin
case PNMLVCustomDraw(LParam).nmcd.dwDrawStage of
CDDS_PREPAINT: result:=CDRF_NOTIFYITEMDRAW;
CDDS_ITEMPREPAINT:
if PNMLVCustomDraw(LParam).nmcd.dwItemSpec mod 2 = 0 then
PNMLVCustomDraw(LParam).clrTextBk := RGB(0, 255, 100)
else
PNMLVCustomDraw(LParam).clrTextBk := RGB(255, 255, 100)
end;
end;
end;
end;Работает. Но сделано ли правильно? А вот как закрасить колонки + как закрасить ячейки любой строки и любого столбца по условию? Искал в инете, не помогло. Помогите пожалуйста. Полный код по требованию! |
|
#2
|
|||
|
|||
|
Извращенец.
У TListView, если, конечно, разговор о стандартном дельфевом контроле, есть спец. событие отрисовки ячейки. |
|
#3
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#4
|
|||
|
|||
|
тогда полный алес. Лезь в исходники и смотри как это реализованно в библиотеке (получение контроля отрисовки ячейки).
Ну и вот тут читани: http://stackoverflow.com/questions/6...ndividual-cell |
|
#5
|
||||
|
||||
|
Код:
type
TCustomAppForm = class(...)
...
function CustomDraw(NMCustomDraw: PNMLVCustomDraw): Integer;
function ItemPrepaint(NMCustomDraw: PNMLVCustomDraw): Integer; virtual;
function SubItemPostPaint(NMCustomDraw: PNMLVCustomDraw): Integer; virtual;
...
function TCustomAppForm.CustomDraw(NMCustomDraw: PNMLVCustomDraw): Integer;
begin
Result:=CDRF_DODEFAULT;
case NMCustomDraw^.nmcd.dwDrawStage of
CDDS_PREPAINT: Result:=CDRF_NOTIFYITEMDRAW;
CDDS_ITEMPREPAINT: Result:=ItemPrepaint(NMCustomDraw);
CDDS_SUBITEM or CDDS_ITEMPREPAINT: Result:=CDRF_NOTIFYPOSTPAINT;
CDDS_SUBITEM or CDDS_ITEMPOSTPAINT: Result:=SubItemPostPaint(NMCustomDraw);
end;
end;
function TCustomAppForm.ItemPrepaint(NMCustomDraw: PNMLVCustomDraw): Integer;
begin
Result:=CDRF_NOTIFYSUBITEMDRAW;
end;
function TCustomAppForm.SubItemPostPaint(NMCustomDraw: PNMLVCustomDraw): Integer;
begin
Result:=CDRF_DODEFAULT;
end;
...
type
TAppForm = class(TCustomAppForm)
...
function ItemPrepaint(NMCustomDraw: PNMLVCustomDraw): Integer; override;
function SubItemPostPaint(NMCustomDraw: PNMLVCustomDraw): Integer; override;
...
function TAppForm.ItemPrepaint(NMCustomDraw: PNMLVCustomDraw): Integer;
begin
Result:=inherited ItemPrepaint(NMCustomDraw);
case ListViewGetItemImage(NMCustomDraw^.nmcd.dwItemSpec) of
IMAGE_READY, IMAGE_ERROR: NMCustomDraw^.clrTextBk:=GetSysColor(COLOR_BTNFACE);
end;
end;
function TAppForm.SubItemPostPaint(NMCustomDraw: PNMLVCustomDraw): Integer;
var
ARect: TRect;
...
begin
Result:=inherited SubItemPostPaint(NMCustomDraw);
if NMCustomDraw^.iSubItem=3 then
begin
ListViewGetSubItemRect(NMCustomDraw^.nmcd.dwItemSpec, NMCustomDraw^.iSubItem, LVIR_BOUNDS, @ARect);
InflateRect(ARect, -1, -1);
case ListViewGetItemImage(NMCustomDraw^.nmcd.dwItemSpec) of
IMAGE_ERROR: begin
DrawError(NMCustomDraw^.nmcd.hdc, ARect);
Result:=CDRF_SKIPDEFAULT;
end;
IMAGE_READY: begin
DrawReady(NMCustomDraw^.nmcd.hdc, ARect);
Result:=CDRF_SKIPDEFAULT;
end;
IMAGE_LOADING: begin
DrawProgressBar(NMCustomDraw^.nmcd.hdc, ARect,
Trunc((GetLoadedBytes(NMCustomDraw^.nmcd.dwItemSpec)*100)/GetTotalFileSize(NMCustomDraw^.nmcd.dwItemSpec))
);
Result:=CDRF_SKIPDEFAULT;
end;
end;
end;
end; |
|
#6
|
||||
|
||||
|
Цитата:
А что такое ListViewGetItemImage и ListViewGetItemImage? |
|
#7
|
||||
|
||||
|
Получилось закрасить первую колонку разным цветом, 2-я колонка другим, 3-ю колонку следующим цветом + общий фон.
ListView.jpg Но как отдельную ячейку? я не пойму. |
|
#8
|
||||
|
||||
|
номер элемента (строки) NMCustomDraw^.nmcd.dwItemSpec
Код:
function TCustomAppForm.ListViewGetItemImage(AItem: Integer): Integer; var Item: TLVItem; begin Item.mask:=LVIF_IMAGE; Item.iItem:=AItem; Item.iSubItem:=0; ListView_GetItem(FListView, Item); Result:=Item.iImage; end; |
|
#9
|
||||
|
||||
|
Так и разобрался с ячейкй.
К скрину: Код:
WM_NOTIFY:
begin
if PNMHDR(lParam).hwndFrom = LV then
case PNMHDR(lParam).code of
NM_CUSTOMDRAW:
begin
case PNMLVCustomDraw(LParam).nmcd.dwDrawStage of
CDDS_PREPAINT: result:=CDRF_NOTIFYITEMDRAW;
CDDS_ITEMPREPAINT: Result:=CDRF_NOTIFYSUBITEMDRAW;
CDDS_SUBITEM or CDDS_ITEMPREPAINT:
begin
Result:=CDRF_DODEFAULT;
PNMLVCustomDraw(LParam).clrTextBk := RGB (100, 100, 100);
case PNMLVCustomDraw(LParam).iSubItem of
0:
if PNMLVCustomDraw(LParam).nmcd.dwItemSpec mod 2 = 0 then
PNMLVCustomDraw(LParam).clrTextBk := RGB(0, 255, 100)
else
PNMLVCustomDraw(LParam).clrTextBk := RGB(255, 255, 100);
1: PNMLVCustomDraw(LParam).clrTextBk := RGB (255, 100, 80); // цвет текста колонки 1
2: PNMLVCustomDraw(LParam).clrTextBk := RGB (20, 20, 255); // цвет текста колонки 2
3: PNMLVCustomDraw(LParam).clrTextBk := RGB (255, 20, 255); // цвет текста колонки 3
end;
end;
end;
end; |