Hi,
ich habe eine Listview mit bestimmten Attributen:
- Zeilen Schriftfarben werden eingefärbt
- Der ausgewählte Eintrag wird Orange dargestellt
- Der abspielende Eintrag wird mit dicker Schrift dargestellt
- Jeder zweite Eintrag wird mit grauem Hintergrund dargestellt
Ich habe in Google nach einer Lösung gesucht um das eigenstängige Selektieren von Windows zu unterbinden, da es dann in Systemfarben wäre, was dann wiederrum nicht zu meinem Layout passen würde. Daher zeichne ich die ganze Zeile immer nochmal neu. Da ich daraufhin keine Lösung für mein neues Problem gefunden habe frage ich euch.
Delphi-Quellcode:
procedure TForm1.PlaylistViewCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
hallo:TLIstItem;
begin
if Fertig=true
then begin
defaultDraw:=false;
hallo:= PlaylistView.Items[Item.Index];
if (Item=nil) then Exit;
//Abspielender Eintrag
with Sender.Canvas.Brush do
if Odd(Item.Index) then Color:=cl3dlight
else Color:=clWhite;
//Abspielender Eintrag
with Sender.Canvas.Font do
if (titelanzeige.Caption=hallo.Caption) and
(interpretlabel.caption= Hallo.SubItems[0]) and
(albumlabel.Caption=hallo.SubItems[1]) and
(genrelabel.Caption= Hallo.SubItems[2]) then Style:=[fsbold]
else Style:=[];
//Markierte Zeile
with Sender.Canvas.Brush do
if hallo.Caption+Hallo.SubItems[0]+hallo.SubItems[1]+Hallo.SubItems[2]=Playlistindex then Color:= clwebdarkorange;
//Text widerherstellen
[B]TextOutOnListview(Playlistview, Item.Index);[/B]
end;
end;
und: TextOutOnListview(Playlistview, Item.Index);
Delphi-Quellcode:
procedure TextOutOnListview(Listview: tListview; Index: integer);
{ GetTextOutPosX
Diese Funktion gibt die x Position zurück, an der der Text gezeichnet
werden muss }
function GetTextOutPosX(Column: integer; Text: string): integer;
var
i: integer;
begin
//Linksbündig?
if Listview.Column[Column].Alignment = taleftJustify then
begin
//Standard Rand von links: 4 pixel
result := 4;
//Breiten aller Spalten zusammenrechnen
for i := 0 to Column - 1 do
result := result + Listview.Column[i].Width + 2;
end
else
//Rechtsbündig?
if Listview.Column[Column].Alignment = taRightJustify then
begin
result := 0;
//Breiten aller Spalten zusammenrechnen
for i := 0 to Column - 1 do
result := result + Listview.Column[i].Width;
//Von der Position die Textbreite abziehen und den Wert von 6 Pixeln für den Rand rechts
result := result + Listview.Column[Column].Width - Listview.Canvas.TextWidth(Text) - 6;
end
else
//Mittig?
if Listview.Column[Column].Alignment = taCenter then
begin
result := 0;
//Breiten aller Spalten zusammenrechnen
for i := 0 to Column - 1 do
result := result + Listview.Column[i].Width;
//Von der Position die halbe Spaltenbreite dazu addieren und die halbe Textbreite wieder abziehen
result := result + trunc((Listview.Column[Column].Width) / 2 - Listview.Canvas.TextWidth(Text) / 2);
end;
end;
var
cols: integer;
begin
//Text der ersten Spalte kopieren
listview.Canvas.TextOut(GetTextOutPosX(0, listview.Items[index].caption), Listview.Items[index].Top, listview.Items[index].caption);
for cols := 1 to listview.Columns.Count - 1 do
//Weitere Columns zeichnen
listview.Canvas.TextOut(GetTextOutPosX(cols, listview.Items[index].SubItems[cols - 1]), Listview.Items[index].Top, listview.Items[index].SubItems[cols - 1]);
//Hintergrundfarbe wieder herstellen
listview.canvas.Brush.Style := bsSolid;
end;
Frage: Warum wird dann nicht die Ganze Zeile der TListview in den angegeben Hintergrundfarben dargestellt, sondern nur der Teil mit Text, und wie löse ich dieses Problem?
Ich bedanke mich schonmal für alle antworten.
Und denkt dran scheißt mich zusammen wenn ich was falsch mache.
Bin theoretisch noch Anfänger!