Einzelnen Beitrag anzeigen

dadu

Registriert seit: 17. Apr 2003
Ort: Dattenberg
102 Beiträge
 
Delphi 2005 Personal
 
#12

Re: Änderung der Farben bei TListView

  Alt 30. Mai 2005, 20:16
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]
DaDu
  Mit Zitat antworten Zitat