Cześć.
Kombinuję i kombinuję, lecz sam za wiele wykombinować nie umiem, a chcę uzyskać efekt podobny do tego jaki posiadają TListView/Box w Total Commanderze. Wiem, że tam autor posłużył się zamiast TListView własnymi komponentami o klasie TMyListBox
, więc pewnie mozolnie zakodował rysowanie kolumn, wyłączanie nagłowków, zmianę kolorów kolumn i rysowanie ikonek plików oraz pozostałe bajery. Pewnie kodem źródłowym się nie podzieli, a mi zależy tylko na jednym prostym efekcie. Takim jak na screenie poniżej, czyli aby pasek którym wybieramy wiersz był przezroczysty. Ale jednocześnie aby móc mieć narysowane SubItemy. Celowo dałem żarówiasty kolor czerwony żeby było to lepiej widać niż przy niebieskawym tle. Zaznaczane elementy mają pojawiać się na zółto. I tak poniższy kod dla zdarzenia AdvancedCustomDrawItem
:
//...
procedure TSelectFilesForm.FilesLVAdvancedCustomDrawItem(
Sender : TCustomListView; Item : TListItem; State : TCustomDrawState;
Stage : TCustomDrawStage; var DefaultDraw : Boolean);
var
S : string;
BRect : TRect;
begin
DefaultDraw := False;
S := Item.Caption;
if (Item.Selected) and (not Item.Focused) then
begin
Sender.Canvas.Brush.Color := DefaultBackgroundcolor;
Sender.Canvas.FillRect(BRect);
Sender.Canvas.Font.Color := Default_Selection_color;
Sender.Canvas.TextRect(Item.DisplayRect(drLabel), Item.Position.x, Item.Position.Y, S);
end;
if Item.Focused then
begin
Sender.Canvas.Brush.Color := clWhite;
Sender.Canvas.FrameRect(Item.DisplayRect(drLabel));
end
else
begin
Sender.Canvas.Brush.Color := DefaultBackgroundcolor;
Sender.Canvas.FillRect(BRect);
Sender.Canvas.Font.Color := clWhite;
Sender.Canvas.TextRect(Item.DisplayRect(drLabel), Item.Position.x, Item.Position.Y, S);
end;
end;
//...
Daje taki efekt i to tylko dzięki temu, że zastosowaliśmy DefaultDraw := False;
.
Bez tej zmiennej lub jeśli ustawimy ją na True efekt będzie taki:
I tutaj pytanie i prośba do Was. Jak można uzyskać ładny efekt wyświetlenia kilku kolumn z podświetleniem wszystkich tekstów i z przezroczystym paskiem wyboru na całą szerokośc z ustawioną własnością RowSelect
na True? Ma ktoś jakiś pomysł? Może ktoś z Was rzeźbił coś podobnego i móglby podzielić się kodem albo wskazówkami? Dodam, że użycie CustomDrawItem
oraz CustomDrawSubItem
odnosi identyczny skutek, w zależności od parametru DefaultDraw
. Googlowałem na wiele sposobów, ale nic konkretnego się nie doszukałem. Z góry dziękuję za wszelką pomoc.