Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.12.2015, 19:22
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию LisView - закрасить колонки и ячейки разными цветами

Здравствуйте.

Решил "разукрасить" 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  
Старый 20.12.2015, 20:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Извращенец.
У TListView, если, конечно, разговор о стандартном дельфевом контроле, есть спец. событие отрисовки ячейки.
Ответить с цитированием
  #3  
Старый 20.12.2015, 20:56
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Извращенец.
Есть не много.

Цитата:
Сообщение от lmikle
У TListView, если, конечно, разговор о стандартном дельфевом контроле, есть спец. событие отрисовки ячейки.
Проект полностью на WinAPI.
Ответить с цитированием
  #4  
Старый 20.12.2015, 23:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

тогда полный алес. Лезь в исходники и смотри как это реализованно в библиотеке (получение контроля отрисовки ячейки).
Ну и вот тут читани: http://stackoverflow.com/questions/6...ndividual-cell
Ответить с цитированием
  #5  
Старый 21.12.2015, 10:01
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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;
ну это в кратце. CustomDraw это обработчик NM_CUSTOMDRAW.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 22.12.2015, 19:53
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
ну это в кратце. CustomDraw это обработчик NM_CUSTOMDRAW.
Спасибо.
А что такое ListViewGetItemImage и ListViewGetItemImage?
Ответить с цитированием
  #7  
Старый 22.12.2015, 21:45
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Получилось закрасить первую колонку разным цветом, 2-я колонка другим, 3-ю колонку следующим цветом + общий фон.
ListView.jpg

Но как отдельную ячейку? я не пойму.
Ответить с цитированием
  #8  
Старый 23.12.2015, 08:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

номер элемента (строки) 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  
Старый 24.12.2015, 20:33
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Так и разобрался с ячейкй.

К скрину:

Код:
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter