Kolor zaznaczenia ListView

0

Cześć, przeszukałem już całe archiwum, ale nic nie znalazłem - chodzi mi o to:

Jak pokolorować tylko zaznaczony element ListView'a. Wiadome - Canvas, ale nie działa oczywiście żaden odSelected tak jak w ListBox'ie i TreeView'ie. Ma ktoś jakiś pomysł ?

0

W onAdvancedCustomDrawItem:

  if (Stage = cdPrePaint) and ( [cdsHot, cdsSelected] * State <> [] ) then
    Sender.Canvas.Brush.Color:=clRed;
0

Nie działa :/ Nadal podczas zaznaczenia kolor jest domyślnie niebieski

0

No, podczas zaznaczania jest domyślny. Ale zaznaczony jest taki, jaki chcesz... Zeby podczas zaznaczania byl inny, to ciezko chyba zrobic...

//PS: aa, sorx, pomylilo mi sie z TreeViewem ;] Wlasnie pracuje nad tym LV.

0

Nom, też właśnie tak myślałem, ale chyba się da, bo o ile pamiętam w eMule był zmieniony kolor zaznaczenia w ListView'ie szukania :)

0

Hmm, to może subclassing i przechwycenie komunikatu WM_PAINT albo coś w tym stylu?

0

Metoda hardcorowa

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
var
 R: TRect;
 n: Integer;
begin
  if cdsSelected in State then
    begin
      // omijamy domyślne rysowanie
      DefaultDraw := False;
      Sender.Canvas.Brush.Color:=clRed;
      R := Item.DisplayRect(drBounds);
      // obejście zamalowywania ikonki
      R.Left := R.Left + 2;
      Sender.Canvas.FillRect(R);
      // i teraz najgorsze - rysowanie itemsów ;/
      // feler - przy resajzowaniu kolumn wpisy "pozostają w miejscu"
      // dopóki się nie odświeży listviewa jakoś
      Sender.Canvas.Font.Color := clWhite;
      Sender.Canvas.TextOut(R.Left + 2, R.Top, Item.Caption);
      for n := 0 to Item.SubItems.Count -1 do
        begin
          R.Left := R.Left + Sender.Column[n].Width;
          Sender.Canvas.TextOut(R.Left + 4, R.Top, Item.SubItems[n]);
        end;
    end;
end;
0

Sheitar: w sumie ok, ale np. na vsList sie troche sypie. Ja w miedzy czasie takiego kolosa wyhodowałem:

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
var ir,r,r0,ni:TRect;
    i:integer;
    LV:TListView;
begin
 if (Stage = cdPrePaint) and ( [cdsHot, cdsSelected] * State <> [] ) then
   begin
     LV:=TListView(Sender);
     r:=Item.DisplayRect(drLabel);
     ir:=Item.DisplayRect(drIcon);
     LV.Canvas.Brush.Color:=$88ff88;

     if (LV.ViewStyle = vsIcon)and(LV.LargeImages<>nil) then
       LV.LargeImages.Draw(Sender.Canvas, (ir.Left + ir.Right - LV.LargeImages.Width) div 2, (ir.Top + ir.Bottom - LV.LargeImages.Height) div 2, Item.ImageIndex)
     else if (LV.SmallImages<>nil) then
       LV.SmallImages.Draw(Sender.Canvas, (ir.Left + ir.Right - LV.LargeImages.Width) div 2, (ir.Top + ir.Bottom - LV.SmallImages.Height) div 2, Item.ImageIndex);

     if (LV.ViewStyle = vsIcon) or (LV.ViewStyle = vsSmallIcon) then
       begin
         LV.Canvas.FillRect(r);
         DrawText(LV.Canvas.Handle,pchar(Item.Caption),-1,r,DT_CENTER or DT_WORDBREAK or DT_EDITCONTROL);
         DrawFocusRect(LV.Canvas.Handle, r);
         DefaultDraw:=False;
       end else
       begin
         r0:=r;
         r.Right:=r.Left;
         DrawText(LV.Canvas.Handle,pchar(Item.Caption),-1,r,DT_LEFT or DT_EDITCONTROL or DT_SINGLELINE or DT_CALCRECT);
         if LV.ViewStyle = vsReport then
           r.Right:=r.Right+8
         else
           r.Right:=r.Right+4;
         if r.Right>r0.Right then r.Right:=r0.Right;
         r.Bottom:=r0.Bottom;
         if (LV.ViewStyle = vsReport) and (LV.RowSelect) then
           begin
             ni:=Item.DisplayRect(drBounds);
             ni.Left:=ni.Left+ir.Right;
           end
         else
           ni:=r;
         LV.Canvas.FillRect(ni);
         r0:=r;
         r0.Left:=r0.Left+2;
         DrawText(LV.Canvas.Handle, pchar(Item.Caption), -1, r0, DT_END_ELLIPSIS or DT_SINGLELINE or DT_VCENTER);
         if LV.ViewStyle = vsReport then
           begin
             r0:=Item.DisplayRect(drBounds);
             r0.Left:=r0.Left+6;
             if not(LV.RowSelect) then
               LV.Canvas.Brush.Color:=LV.Color;
             LV.Canvas.Refresh;
             for i := 0 to Item.SubItems.Count -1 do
               begin
                 r0.Left := r0.Left + LV.Column[i].Width;
                 DrawText(LV.Canvas.Handle, pchar(Item.Subitems[i]), -1, r0, DT_SINGLELINE or DT_VCENTER);
               end;
             if LV.RowSelect then r:=Item.DisplayRect(drBounds);
           end;
       DrawFocusRect(LV.Canvas.Handle, ni);
       DefaultDraw:=False;
     end;
   end else DefaultDraw:=True;
end;

//Po drobnych poprawkach... A wydawalo by sie, ze to taka prosta sprawa ;-)
//Znowu po poprawkach ;]

0
Pawel200x.5 napisał(a)

Sheitar: w sumie ok, ale np. na vsList sie troche sypie.

Temu hardcorowa, no i zapomniałem dodać że działa dobrze tylko przy vsReport (na innych nawet nie sprawdzałem :P dla mnie LV istnieje tylko dla vsReport :P) no i najlepiej jakby nie dało się zmieniać rozmiaru kolumn, bo brzydki wałek jest :/.

Twój się natomiast sypie przy bsReport i RowSelect := True; i przy resajzowaniu kolumn subitemy w ogóle znikają :P Zresztą w tym moim też znikają czasem.

0

Niby ładnie już to wyglądało, ale niestety przy rowselect sie sypie, bo niezaznacza calej linii :/

0

iSo: teraz juz dziala zawsze, tylko tak jak u Sheitara przy rozszerzaniu kolum sie sypie. Chyba to walne do faq'a.

0

Sorka, że odgrzebuje trochę stary temat, ale właśnie taka procedura mi potrzebna, a ta podana tutaj się wywala cały czas :( Normalnie jest, dopuki niezaczne rorzeżać kolumny. Mógłby ktoś pomóc mi to zmodyfikować, żeby już wszystko było ok, na pewno przyda to się dużej ilości osób, bo tego nawet NIE MA na Torrym...

0
//Wymagane MultiSelect := False;

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
begin
 if ListView1.Selected = Item then
   begin
    ListView1.Canvas.Brush.Color := clRed;
    ListView1.Selected := Item.ListView.DropTarget;
   end;
end;

Przy ustawieniu:

MultiSelect := True

występują jeszcze lekkie problemy :-P

// po co odświeżasz takie starocie? - Ł

1 użytkowników online, w tym zalogowanych: 0, gości: 1