Laden...

[erledigt] Listview DrawSubItem DrawBackground() -> Hintergund im ganzen Subitem!

Erstellt von *neo* vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.381 Views
*
*neo* Themenstarter:in
299 Beiträge seit 2006
vor 9 Jahren
[erledigt] Listview DrawSubItem DrawBackground() -> Hintergund im ganzen Subitem!

Hallo,

ich habe die Eigenschaft OwnerDraw an einer Listview aktiviert und habe jeweils die folgenden Methoden implementiert. Ziel iet es bestimmte Zeilen slbst du zeichen, die im Tag einen Wert drin stehen haben. das klappt auch soweit gut. Hier die Methoden:


private void ListView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
	if (e.Item.Tag == null)
	{
		e.DrawDefault = true;
	}
}

private void ListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
   e.DrawDefault = true;
}

private void ListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{

	for (int i = 0; i < e.Item.SubItems.Count; i++)
	{
		if (e.ItemIndex % 2 != 0)
		{
			e.Item.SubItems[i].BackColor = Color.Red;
			e.Item.SubItems[i].ForeColor = System.Drawing.SystemColors.WindowText;
		}
		else
		{
			e.Item.SubItems[i].BackColor = System.Drawing.SystemColors.Window;
			e.Item.SubItems[i].ForeColor = System.Drawing.SystemColors.WindowText;
		}
	}

	if (e.ColumnIndex == 0)
	{
		if (e.Item.Tag == null)
		{
			CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(e.Item.Bounds.X + 4, e.Item.Bounds.Y + 2), System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
		}

		e.DrawBackground();

		e.Graphics.DrawImage (((MainForm)this.Owner).getImageList ().Images [((MainForm)this.Owner).getImageList ().Images.IndexOfKey (e.Item.Tag.ToString())], new Point (e.Item.Bounds.X + 19, e.Item.Bounds.Y));

		e.Graphics.DrawString(e.Item.Text, e.Item.Font, Brushes.Black, new Point(e.Item.Bounds.X + 36, e.Item.Bounds.Y + 2));
	}
	else
	{
		e.DrawDefault = true;
	}
}

Das Ergebis daraus seht ihr im Anhang.

Bestimmte Zeilen, je nach Füllung des Tag, zeiche ich mit der ListView_DrawSubItem Methode. Dabei fällt auf, dass das erste Subitem den kompletten Hintergrund mit rosa befüllt hat, und bei allen anderen Zeilen sind das erste Subitem norma, also nicht komplett gefülltl.

Scheinbar wir im Standard der Hintergrund anders gezeichnet. Ich habe eigentlich gedacht dass ich mit e.DrawBackground(); das ich damit den Hintergrund des ersten Subitem auch so Zeichne wie im Standard.

Haben ich einen Denkfehler?

Beim Bild bedeutet:
1 = mein eigen gezeichneten Zeile
2 = Standard Zeile

Grüße

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo neo,

es kann sein, dass bei der Standard-Zelle der Hintergrund ebenfalls vollständig gezeichnet wird, aber dann durch spätere Zeichenoperation (hier das CheckBox und das Häkchen) überschrieben wird, zum Beispiel weil der Hintergrund der Bitmap mit dem Häkchen nicht transparent sondern weiß ist.

Wenn es dir nicht gefällt, wie die standardmäßige Zelle gezeichnet wird, dann kannst du sie ja auch selbst zeichnen.

herbivore

*
*neo* Themenstarter:in
299 Beiträge seit 2006
vor 9 Jahren

Hallo,

ich habe es tatsächlich so gelöst, dass ich ein Rechteck gezeichnet habe und darunter gelegt habe


e.Graphics.DrawRectangle(new Pen(new SolidBrush(System.Drawing.SystemColors.Control)), new Rectangle(new Point(e.Item.SubItems[0].Bounds.X - 2, e.Item.SubItems[0].Bounds.Y - 1), new Size(e.Item.SubItems[1].Bounds.Width, e.Item.SubItems[0].Bounds.Height)));

Grüße und Danke