На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > Как поменять цвет Header'а в TListView
      Для этого нужно в оконной процедуре ListView обработать сообщение WM_NOTIFY с кодом NM_CUSTOMDRAW. И в обработчике этого сообщения назначить цвета фона и текста (можно назначить и шрифт). Но при этом правая часть header'а (область заголовка ListView, находящаяся справа от колонок) закрашиваться не будет. Чтобы закрасить и её, надо в оконной процедуре header'а обработать сообщение WM_ERASEBKGND, в котором и залить нужным цветом эту область. Ниже - небольшой примерчик с сабклассингом.

      ExpandedWrap disabled
        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
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0164 ]   [ 17 queries used ]   [ Generated: 29.03.24, 11:49 GMT ]