Для этого нужно в оконной процедуре ListView обработать сообщение WM_NOTIFY с кодом NM_CUSTOMDRAW. И в обработчике этого сообщения назначить цвета фона и текста (можно назначить и шрифт). Но при этом правая часть header'а (область заголовка ListView, находящаяся справа от колонок) закрашиваться не будет. Чтобы закрасить и её, надо в оконной процедуре header'а обработать сообщение WM_ERASEBKGND, в котором и залить нужным цветом эту область. Ниже - небольшой примерчик с сабклассингом.

Code:

uses CommCtrl;

 

var

BkBrush:HBRUSH; // тут сохраняем brush для фона

 

// процедура header'а

function NewHeaderProc(wnd: HWND; Msg: Cardinal; wParam: wParam;

                         lParam: lParam): Longint; stdcall;

var

BrushOld: HBRUSH;

ClientRect:TRect;

begin

Result := CallWindowProc(Pointer(GetWindowLong(wnd, GWL_USERDATA)),

                         wnd, Msg, wParam, lParam);

 

if Msg=WM_ERASEBKGND then // закрашиваем область справа от колонок

begin

  GetClientRect(wnd,ClientRect);

  BrushOld := SelectObject(wParam, BkBrush);

  FillRect(wParam, ClientRect, BkBrush);

  SelectObject(wParam, BrushOld);

  Result := 1;

end

end;

 

// процедура ListView

function NewListProc(wnd:HWND; uMsg:UINT; wParam:WPARAM;

                    lParam:LPARAM):integer; stdcall;

var

nmlvcd:PNMLVCUSTOMDRAW;

begin

  result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,

                         uMsg,wParam,lParam);

  if uMsg=WM_NOTIFY then

   if PNMLISTVIEW(lParam)^.hdr.code=NM_CUSTOMDRAW then

   begin

    nmlvcd:=PNMLVCUSTOMDRAW(lparam);

    case nmlvcd.nmcd.dwDrawStage of

      CDDS_PREPAINT:  result:=CDRF_NOTIFYITEMDRAW;

      CDDS_ITEMPREPAINT:

                  begin

                    SetTextColor(nmlvcd.nmcd.hdc,clRed);    // цвет текста

                    SetBkColor(nmlvcd.nmcd.hdc,clYellow);   // цвет фона

                    result:=CDRF_DODEFAULT;

                  end;

     CDDS_ITEMPOSTPAINT: result := CDRF_DODEFAULT;

    end

   end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

var

i,j:integer;

lit:TListItem;

begin

with ListView1 do

begin

ViewStyle := vsReport; // стиль, естественно vsReport

GridLines:=true;

 

// заполним ListView чем-нибудь

for i:=0 to 2 do

begin

    Columns.Add.Caption:='Column'+IntToStr(i);

    Columns[i].Width:=70;

    lit:=Items.Add;

    lit.Caption:='Item'+IntToStr(i);

    for j:=1 to 2 do lit.SubItems.Add('SubItem'+IntToStr(j)+IntToStr(i))

end

end;

 

//меняем процедуру у ListView

SetWindowLong(ListView1.Handle,GWL_USERDATA,SetWindowLong(ListView1.Handle,

                  GWL_WNDPROC, LPARAM(@NewListProc)));

 

//тоже самое у Header'а

SetWindowLong(GetWindow(ListView1.Handle, GW_CHILD),GWL_USERDATA,

             SetWindowLong(GetWindow(ListView1.Handle, GW_CHILD),

             GWL_WNDPROC, LPARAM(@NewHeaderProc)));

 

BkBrush := CreateSolidBrush(clYellow); // цвет фона

 

end;

Ещё вариант: для каждого элемента header'а установить флаг HDF_OWNERDRAW и в оконной процедуре ListView обрабатывать WM_DRAWITEM, где так же назначать цвета для элементов заголовка ListView.
 

 
Автор: Krid

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить