ListView: Zeilen farbig darstellen



  • Du schreibst oben, Du hast die Funktion "modifiziert". Inwieweit, wenn ich fragen darf? Und zeig mal etwas Quellcode her ...



  • Hier der Code! Ich weiß halt nicht wie ich das TRect, das ich übergebe initialisiert sein muß!!

    void __fastcall TForm1::ListViewColorLine(TListItem *Item, TRect &Rect, int Auswahl)
    {
      switch(Auswahl)
      {
       case 0:
       {
         ListView->Canvas->Brush->Color = clWhite;
         ListView->Canvas->Font->Color  = clBlack;
         break;
       }
       case 1:
       {
         ListView->Canvas->Brush->Color = clWhite;
         ListView->Canvas->Font->Color  = clBlack;
         break;
       }
       case 2:
       {
         ListView->Canvas->Brush->Color = clWhite;
         ListView->Canvas->Font->Color  = clFuchsia;
         break;
       }
       case 3:
       {
         ListView->Canvas->Brush->Color = clYellow;
         ListView->Canvas->Font->Color  = clBlack;
         break;
       }
       case 4:
       {
         ListView->Canvas->Brush->Color = clRed;
         ListView->Canvas->Font->Color  = clBlack;
         break;
       }
       default:
       {
         ListView->Canvas->Brush->Color = clWhite;
         ListView->Canvas->Font->Color  = clBlack;
       }
     }
    
     ListView->Canvas->FillRect(Rect);
    
     int width   = Item->Left;
     Rect.Left  += 2;
    
     DrawText(ListView->Canvas->Handle, Item->Caption.c_str(), -1, &Rect, DT_SINGLELINE); // | DT_VCENTER | DT_LEFT
    
     Rect.Right = width;
     int left   = Rect.Left - 2;
    
     for (int z = 0; z < Item->SubItems->Count; z++)
     {
       left += ListView->Columns->Items[z]->Width;
    
       Rect.Left  = left;
       Rect.Right = left + ListView->Columns->Items[z + 1]->Width;
    
       if(z > 2)
       {
         Rect.Right -= 2;
         DrawText(ListView->Canvas->Handle, Item->SubItems->Strings[z].c_str(), -1, &Rect, DT_SINGLELINE);// | DT_VCENTER | DT_RIGHT
       }
       else
       {
         if(z > 0)
         {
           DrawText(ListView->Canvas->Handle, Item->SubItems->Strings[z].c_str(), -1, &Rect, DT_SINGLELINE);// | DT_VCENTER | DT_CENTER
         }
         else
         {
           Rect.Left  += 2;
           DrawText(ListView->Canvas->Handle, Item->SubItems->Strings[z].c_str(), -1, &Rect, DT_SINGLELINE);// | DT_VCENTER | DT_LEFT
         }
       }
     }
    
    }
    


  • Also, schau Dir doch mal richtig den Code an:

    Sunday's Code:

    void __fastcall TF_Ausgang::ListViewObjektDrawItem(TCustomListView *Sender, TListItem *Item, TRect &Rect, TOwnerDrawState State)
    {
    ...
    }
    

    Dein Code:

    void __fastcall TForm1::ListViewColorLine(TListItem *Item, TRect &Rect, int Auswahl)
    {
    ...
    }
    

    Die Übergabeparameter an die Funktion stimmen nicht überein.

    Lösung:

    In der Objektinspektor-Ansicht Deines ListViews unter Ereignisse "OnDrawItem" doppelklicken und Deinen Quellcode in den so erstellten Funktionsrumpf reinkopieren. Oder besser: erstmal den von Sunday reinbasteln und dann modifizieren.



  • Ich habe nochmal eine Frage zu ListView-OwnerDraw:

    Was muss am Code noch verändert werden, dass Icons aus einer ImageList angezeigt werden können? Im Beispiel werden die nämlich erstmal nicht mehr dargestellt ...



  • Ich gehe mal davon aus, dass du die per CopyRect o.ä. ebenfalls selbst zeichnen musst.



  • Wenn dieses Thema mal wieder aufgedeckt wird!
    Es geht auch einfacher:

    Mit CustomDrawItem. Hier muß man nichtmal OwnerDraw auf true stellen!
    Funktioniert bestimmt.

    void __fastcall TForm1::ListViewCustomDrawItem(TCustomListView *Sender,
          TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
    {
       TColor BackgroundColor;
       TColor PencilColor;
    
       //Farben übergeben i ist z.B ein IntegerWert
       switch(i)
       {
         case 0:
         {
           BackgroundColor = clRed;
           PencilColor = clBlack;
           break;
         }
         case 1:
         {
           BackgroundColor = clBlue;
           PencilColor = clYellow;
           break;
         }
         default:
         {
           DefaultDraw = true;
           return;
         } 
       }
    
       //Zeilen mit gewünschter Farbe
       Sender->Canvas->Brush->Color = BackgroundCol;
       Sender->Canvas->Font->Color = PencilCol;
    }
    

    Hoff das hilft dem nächsten, der sich mit sowas auseinandersetzen muß!



  • Wie zeichnet man denn nur die 3. Zeile farbig (RowSelect=true)?
    Oder anders gefragt, wie komme ich an das Rect der dritten Zeile ran?

    Ich möchte gern immer die Zeile andersfarbig unterlegen, welche selektiert wurde, so das wenn der Focus des ListView verloren geht, man weiterhin sieht welche Zeile zuletzt ausgewählt war.



  • Dafür ist der Parameter 'State' vorgesehen.
    Einfach abfragen, ob State den Wert 'cdsSelected' besitzt und dann entsprechend farbig zeichnen.



  • Hatte es jetzt so gelöst

    if (Item->Selected)
        {
            ListView1->Canvas->Brush->Color = 0x00C56A31;
            ListView1->Canvas->Font->Color = clWhite;
        }
    

    Trotzdem wäre es ganz Interessant zu wissen wie man bestimmte Zeilen farbig setzt.



  • Hallo

    Wie zeichnet man denn nur die 3. Zeile farbig (RowSelect=true)?
    Oder anders gefragt, wie komme ich an das Rect der dritten Zeile ran?

    Mit dem selben Event. Nur eben die Bedingung ist anders, als State auf Selected zu überprüfen.

    Zum Beispiel haben die Items des ListViews die Eigenschaft Index, anhand du die Nummer des aktuellen Items auswerten kannst

    bis bald
    akari


Anmelden zum Antworten