ListView: Zeilen farbig darstellen
-
Original erstellt von <Bernie>:
nicht mal die SubItems werden dargestelltDie entsprechenden Columns hast du aber eingerichtet!?
-
Schon mal meinen obenstehenden Beitrag gelesen?

-
Ja, Columns sind eingestellt, und OwnerDraw steht auch auf true!!
Kann sein, dass ich das TRect Rect am Anfang falsch initialisiere!
Wie initialisiert man es denn am besten(richtig)?
-
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