Hi Leute,
da ich demnächst vor dem selben Problem stehe, habe ich hier mal eine allgemein zu gebrauchene Procedure geschrieben.
Wäre gut wenn ihr die mal testen könntet, bei mir läuft sie.
Delphi-Quellcode:
{ TextOutOnListview
written by David Dung 2005
Diese Procedure ermöglicht die Manipulation des Hintergrundes einer
TListview. Z.B. zum Verändern der Markierungsfarben.
Vorgehen:
Quellcode im OnCustomDrawItem-Event der Listview
- "DefaultDraw" auf "False" setzten
- Beliebig auf die Zeichenfläche malen
- TextOutOnListview("die Listview", Item.Index); aufrufen
Hiermit wird der Inhalt der Listview mit transparenter Hintergrund-
und Schriftfarbe des Listview auf die Zeichenfläche kopiert. }
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
//Hintergrundfarbe durchsichtig
listview.canvas.Brush.Style := bsClear;
//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;
Bsp:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
DefaultDraw := false;
//Hier könnt ihr jetzt alles auf Sender.Canvas malen, was ihr wollt
//Am Ende meine Procedure aufrufen um Text widerherzustellen
TextOutOnListview(Listview1, Item.Index);
end;
[Edit] Jetzt kommt die Procedure auch mit mittigen Spalten zurecht.[/Edit]